@colyseus/uwebsockets-transport 0.14.26 → 0.15.0-preview.1

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 CHANGED
@@ -103,31 +103,30 @@ Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds
103
103
  <!-- markdownlint-disable -->
104
104
  <table>
105
105
  <tr>
106
+ <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/gamestdio/colyseus/commits?author=endel" title="Code">💻</a> <a href="https://github.com/gamestdio/colyseus/commits?author=endel" title="Documentation">📖</a> <a href="#example-endel" title="Examples">💡</a></td>
107
+ <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/gamestdio/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>
108
+ <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/gamestdio/colyseus/issues?q=author%3Aseiyria" title="Bug reports">🐛</a> <a href="https://github.com/gamestdio/colyseus/commits?author=seiyria" title="Code">💻</a> <a href="#ideas-seiyria" title="Ideas, Planning, & Feedback">🤔</a></td>
109
+ <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>
106
110
  <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>
107
- <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>
108
- <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>
109
- <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>
110
- <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>
111
+ <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/gamestdio/colyseus/issues?q=author%3AWenish" title="Bug reports">🐛</a> <a href="https://github.com/gamestdio/colyseus/commits?author=Wenish" title="Code">💻</a> <a href="#ideas-Wenish" title="Ideas, Planning, & Feedback">🤔</a> <a href="#example-Wenish" title="Examples">💡</a></td>
111
112
  <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>
112
- <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>
113
113
  </tr>
114
114
  <tr>
115
- <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>
116
- <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>
117
- <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>
118
- <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>
119
- <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>
120
- <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>
121
- <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>
115
+ <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>
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/gamestdio/colyseus/commits?author=damian-pastorini" title="Documentation">📖</a> <a href="https://github.com/gamestdio/colyseus/issues?q=author%3Adamian-pastorini" title="Bug reports">🐛</a></td>
117
+ <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/gamestdio/colyseus/issues?q=author%3ALukeWood" title="Bug reports">🐛</a> <a href="https://github.com/gamestdio/colyseus/commits?author=LukeWood" title="Code">💻</a></td>
118
+ <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/gamestdio/colyseus/issues?q=author%3Adoorbash" title="Bug reports">🐛</a> <a href="https://github.com/gamestdio/colyseus/commits?author=doorbash" title="Code">💻</a></td>
119
+ <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/gamestdio/colyseus/issues?q=author%3Aserjek" title="Bug reports">🐛</a> <a href="https://github.com/gamestdio/colyseus/commits?author=serjek" title="Code">💻</a></td>
120
+ <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/gamestdio/colyseus/issues?q=author%3AZielak" title="Bug reports">🐛</a> <a href="https://github.com/gamestdio/colyseus/commits?author=Zielak" title="Code">💻</a></td>
121
+ <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/gamestdio/colyseus/issues?q=author%3ATinyDobbins" title="Bug reports">🐛</a> <a href="https://github.com/gamestdio/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>
122
122
  </tr>
123
123
  <tr>
124
- <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>
125
- <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>
126
- <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>
127
- <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>
128
- <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>
129
- <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>
130
- <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>
124
+ <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/gamestdio/colyseus/commits?author=filharvey" title="Documentation">📖</a></td>
125
+ <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>
126
+ <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>
127
+ <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/gamestdio/colyseus/commits?author=digimbyte" title="Documentation">📖</a></td>
128
+ <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/gamestdio/colyseus/issues?q=author%3Aoyed" title="Bug reports">🐛</a> <a href="#ideas-oyed" title="Ideas, Planning, & Feedback">🤔</a></td>
129
+ <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/gamestdio/colyseus/issues?q=author%3AFederkun" title="Bug reports">🐛</a> <a href="https://github.com/gamestdio/colyseus/commits?author=Federkun" title="Code">💻</a></td>
131
130
  </tr>
132
131
  </table>
133
132
 
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /*! *****************************************************************************
6
+ Copyright (c) Microsoft Corporation.
7
+
8
+ Permission to use, copy, modify, and/or distribute this software for any
9
+ purpose with or without fee is hereby granted.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
+ PERFORMANCE OF THIS SOFTWARE.
18
+ ***************************************************************************** */
19
+
20
+ function __awaiter(thisArg, _arguments, P, generator) {
21
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
22
+ return new (P || (P = Promise))(function (resolve, reject) {
23
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
24
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
25
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
26
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
27
+ });
28
+ }
29
+
30
+ exports.__awaiter = __awaiter;
31
+ //# sourceMappingURL=tslib.es6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tslib.es6.js","sources":["../../../../../../node_modules/tslib/tslib.es6.js"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || from);\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n"],"names":[],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAuDA;AACO,SAAS,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE;AAC7D,IAAI,SAAS,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,KAAK,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;AAChH,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,EAAE,MAAM,EAAE;AAC/D,QAAQ,SAAS,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;AACnG,QAAQ,SAAS,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;AACtG,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;AACtH,QAAQ,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9E,KAAK,CAAC,CAAC;AACP;;;;"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var uWebSocketsTransport = require('./uWebSocketsTransport.js');
6
+
7
+
8
+
9
+ exports.uWebSocketsTransport = uWebSocketsTransport.uWebSocketsTransport;
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,91 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var EventEmitter = require('events');
6
+ var core = require('@colyseus/core');
7
+ var schema = require('@colyseus/schema');
8
+
9
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
+
11
+ var EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
12
+
13
+ class uWebSocketWrapper extends EventEmitter__default['default'] {
14
+ constructor(ws) {
15
+ super();
16
+ this.ws = ws;
17
+ }
18
+ }
19
+ exports.ReadyState = void 0;
20
+ (function (ReadyState) {
21
+ ReadyState[ReadyState["CONNECTING"] = 0] = "CONNECTING";
22
+ ReadyState[ReadyState["OPEN"] = 1] = "OPEN";
23
+ ReadyState[ReadyState["CLOSING"] = 2] = "CLOSING";
24
+ ReadyState[ReadyState["CLOSED"] = 3] = "CLOSED";
25
+ })(exports.ReadyState || (exports.ReadyState = {}));
26
+ class uWebSocketClient {
27
+ constructor(id, ref) {
28
+ this.id = id;
29
+ this.ref = ref;
30
+ this.state = core.ClientState.JOINING;
31
+ this._enqueuedMessages = [];
32
+ this.readyState = exports.ReadyState.OPEN;
33
+ this.sessionId = id;
34
+ ref.on('close', () => this.readyState = exports.ReadyState.CLOSED);
35
+ }
36
+ send(messageOrType, messageOrOptions, options) {
37
+ this.enqueueRaw((messageOrType instanceof schema.Schema)
38
+ ? core.getMessageBytes[core.Protocol.ROOM_DATA_SCHEMA](messageOrType)
39
+ : core.getMessageBytes[core.Protocol.ROOM_DATA](messageOrType, messageOrOptions), options);
40
+ }
41
+ enqueueRaw(data, options) {
42
+ // use room's afterNextPatch queue
43
+ if (options === null || options === void 0 ? void 0 : options.afterNextPatch) {
44
+ this._afterNextPatchQueue.push([this, arguments]);
45
+ return;
46
+ }
47
+ if (this.state === core.ClientState.JOINING) {
48
+ // sending messages during `onJoin`.
49
+ // - the client-side cannot register "onMessage" callbacks at this point.
50
+ // - enqueue the messages to be send after JOIN_ROOM message has been sent
51
+ this._enqueuedMessages.push(data);
52
+ return;
53
+ }
54
+ this.raw(data, options);
55
+ }
56
+ raw(data, options, cb) {
57
+ if (this.readyState !== exports.ReadyState.OPEN) {
58
+ console.warn('trying to send data to inactive client', this.sessionId);
59
+ return;
60
+ }
61
+ this.ref.ws.send(new Uint8Array(data), true, false);
62
+ }
63
+ error(code, message = '', cb) {
64
+ this.raw(core.getMessageBytes[core.Protocol.ERROR](code, message), undefined, cb);
65
+ }
66
+ leave(code, data) {
67
+ if (code !== undefined) {
68
+ this.ref.ws.end(code, data);
69
+ }
70
+ else {
71
+ this.ref.ws.close();
72
+ }
73
+ }
74
+ close(code, data) {
75
+ console.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');
76
+ try {
77
+ throw new Error();
78
+ }
79
+ catch (e) {
80
+ console.log(e.stack);
81
+ }
82
+ this.leave(code, data);
83
+ }
84
+ toJSON() {
85
+ return { sessionId: this.sessionId, readyState: this.readyState };
86
+ }
87
+ }
88
+
89
+ exports.uWebSocketClient = uWebSocketClient;
90
+ exports.uWebSocketWrapper = uWebSocketWrapper;
91
+ //# sourceMappingURL=uWebSocketClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uWebSocketClient.js","sources":["../../../../../src/uWebSocketClient.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { getMessageBytes, Protocol, Client, ClientState, ISendOptions } from '@colyseus/core';\nimport { Schema } from '@colyseus/schema';\n\nexport class uWebSocketWrapper extends EventEmitter {\n constructor(public ws: uWebSockets.WebSocket) {\n super();\n }\n}\n\nexport enum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\nexport class uWebSocketClient implements Client {\n public sessionId: string;\n public state: ClientState = ClientState.JOINING;\n public _enqueuedMessages: any[] = [];\n public _afterNextPatchQueue;\n public readyState: number = ReadyState.OPEN;\n\n constructor(\n public id: string,\n public ref: uWebSocketWrapper,\n ) {\n this.sessionId = id;\n\n ref.on('close', () => this.readyState = ReadyState.CLOSED);\n }\n\n public send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions) {\n this.enqueueRaw(\n (messageOrType instanceof Schema)\n ? getMessageBytes[Protocol.ROOM_DATA_SCHEMA](messageOrType)\n : getMessageBytes[Protocol.ROOM_DATA](messageOrType, messageOrOptions),\n options,\n );\n }\n\n public enqueueRaw(data: ArrayLike<number>, options?: ISendOptions) {\n // use room's afterNextPatch queue\n if (options?.afterNextPatch) {\n this._afterNextPatchQueue.push([this, arguments]);\n return;\n }\n\n if (this.state === ClientState.JOINING) {\n // sending messages during `onJoin`.\n // - the client-side cannot register \"onMessage\" callbacks at this point.\n // - enqueue the messages to be send after JOIN_ROOM message has been sent\n this._enqueuedMessages.push(data);\n return;\n }\n\n this.raw(data, options);\n }\n\n public raw(data: ArrayLike<number>, options?: ISendOptions, cb?: (err?: Error) => void) {\n if (this.readyState !== ReadyState.OPEN) {\n console.warn('trying to send data to inactive client', this.sessionId);\n return;\n }\n\n this.ref.ws.send(new Uint8Array(data), true, false);\n }\n\n public error(code: number, message: string = '', cb?: (err?: Error) => void) {\n this.raw(getMessageBytes[Protocol.ERROR](code, message), undefined, cb);\n }\n\n public leave(code?: number, data?: string) {\n if (code !== undefined) {\n this.ref.ws.end(code, data);\n\n } else {\n this.ref.ws.close();\n }\n }\n\n public close(code?: number, data?: string) {\n console.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');\n try {\n throw new Error();\n } catch (e) {\n console.log(e.stack);\n }\n this.leave(code, data);\n }\n\n public toJSON() {\n return { sessionId: this.sessionId, readyState: this.readyState };\n }\n}\n"],"names":["EventEmitter","ReadyState","ClientState","Schema","getMessageBytes","Protocol"],"mappings":"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"}
@@ -0,0 +1,249 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib_es6 = require('../../../../node_modules/tslib/tslib.es6.js');
6
+ var querystring = require('querystring');
7
+ var uWebSockets = require('uWebSockets.js');
8
+ var core = require('@colyseus/core');
9
+ var uWebSocketClient = require('./uWebSocketClient.js');
10
+
11
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+
13
+ var querystring__default = /*#__PURE__*/_interopDefaultLegacy(querystring);
14
+ var uWebSockets__default = /*#__PURE__*/_interopDefaultLegacy(uWebSockets);
15
+
16
+ class uWebSocketsTransport extends core.Transport {
17
+ constructor(options = {}, appOptions = {}) {
18
+ super();
19
+ this.clients = [];
20
+ this.clientWrappers = new WeakMap();
21
+ this.app = (appOptions.cert_file_name && appOptions.key_file_name)
22
+ ? uWebSockets__default['default'].SSLApp(appOptions)
23
+ : uWebSockets__default['default'].App(appOptions);
24
+ if (!options.maxBackpressure) {
25
+ options.maxBackpressure = 1024 * 1024;
26
+ }
27
+ if (!options.compression) {
28
+ options.compression = uWebSockets__default['default'].DISABLED;
29
+ }
30
+ if (!options.maxPayloadLength) {
31
+ options.maxPayloadLength = 1024 * 1024;
32
+ }
33
+ this.app.ws('/*', Object.assign(Object.assign({}, options), { upgrade: (res, req, context) => {
34
+ // get all headers
35
+ const headers = {};
36
+ req.forEach((key, value) => headers[key] = value);
37
+ /* This immediately calls open handler, you must not use res after this call */
38
+ /* Spell these correctly */
39
+ res.upgrade({
40
+ url: req.getUrl(),
41
+ query: req.getQuery(),
42
+ // compatibility with @colyseus/ws-transport
43
+ headers,
44
+ connection: {
45
+ remoteAddress: Buffer.from(res.getRemoteAddressAsText()).toString()
46
+ }
47
+ }, req.getHeader('sec-websocket-key'), req.getHeader('sec-websocket-protocol'), req.getHeader('sec-websocket-extensions'), context);
48
+ }, open: (ws) => tslib_es6.__awaiter(this, void 0, void 0, function* () {
49
+ // ws.pingCount = 0;
50
+ yield this.onConnection(ws);
51
+ }),
52
+ // pong: (ws: RawWebSocketClient) => {
53
+ // ws.pingCount = 0;
54
+ // },
55
+ close: (ws, code, message) => {
56
+ // remove from client list
57
+ core.spliceOne(this.clients, this.clients.indexOf(ws));
58
+ const clientWrapper = this.clientWrappers.get(ws);
59
+ if (clientWrapper) {
60
+ this.clientWrappers.delete(ws);
61
+ // emit 'close' on wrapper
62
+ clientWrapper.emit('close', code);
63
+ }
64
+ }, message: (ws, message, isBinary) => {
65
+ var _a;
66
+ // emit 'close' on wrapper
67
+ (_a = this.clientWrappers.get(ws)) === null || _a === void 0 ? void 0 : _a.emit('message', Buffer.from(message.slice(0)));
68
+ } }));
69
+ this.registerMatchMakeRequest();
70
+ }
71
+ listen(port, hostname, backlog, listeningListener) {
72
+ this.app.listen(port, (listeningSocket) => {
73
+ this._listeningSocket = listeningSocket;
74
+ listeningListener === null || listeningListener === void 0 ? void 0 : listeningListener();
75
+ });
76
+ return this;
77
+ }
78
+ shutdown() {
79
+ if (this._listeningSocket) {
80
+ uWebSockets__default['default'].us_listen_socket_close(this._listeningSocket);
81
+ }
82
+ }
83
+ simulateLatency(milliseconds) {
84
+ const originalRawSend = uWebSocketClient.uWebSocketClient.prototype.raw;
85
+ uWebSocketClient.uWebSocketClient.prototype.raw = function () {
86
+ setTimeout(() => originalRawSend.apply(this, arguments), milliseconds);
87
+ };
88
+ }
89
+ onConnection(rawClient) {
90
+ return tslib_es6.__awaiter(this, void 0, void 0, function* () {
91
+ const wrapper = new uWebSocketClient.uWebSocketWrapper(rawClient);
92
+ // keep reference to client and its wrapper
93
+ this.clients.push(rawClient);
94
+ this.clientWrappers.set(rawClient, wrapper);
95
+ const query = rawClient.query;
96
+ const url = rawClient.url;
97
+ const sessionId = querystring__default['default'].parse(query).sessionId;
98
+ const processAndRoomId = url.match(/\/[a-zA-Z0-9_\-]+\/([a-zA-Z0-9_\-]+)$/);
99
+ const roomId = processAndRoomId && processAndRoomId[1];
100
+ const room = core.matchMaker.getRoomById(roomId);
101
+ const client = new uWebSocketClient.uWebSocketClient(sessionId, wrapper);
102
+ //
103
+ // TODO: DRY code below with all transports
104
+ //
105
+ try {
106
+ if (!room || !room.hasReservedSeat(sessionId)) {
107
+ throw new Error('seat reservation expired.');
108
+ }
109
+ yield room._onJoin(client, rawClient);
110
+ }
111
+ catch (e) {
112
+ core.debugAndPrintError(e);
113
+ // send error code to client then terminate
114
+ client.error(e.code, e.message, () => rawClient.close());
115
+ }
116
+ });
117
+ }
118
+ registerMatchMakeRequest() {
119
+ const headers = {
120
+ 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
121
+ 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',
122
+ 'Access-Control-Allow-Origin': '*',
123
+ 'Access-Control-Max-Age': 2592000,
124
+ // ...
125
+ };
126
+ // TODO: DRY with Server.ts
127
+ const matchmakeRoute = 'matchmake';
128
+ const allowedRoomNameChars = /([a-zA-Z_\-0-9]+)/gi;
129
+ const writeHeaders = (res) => {
130
+ for (const header in headers) {
131
+ res.writeHeader(header, headers[header].toString());
132
+ }
133
+ };
134
+ const writeError = (res, error) => {
135
+ res.writeStatus("406 Not Acceptable");
136
+ res.end(JSON.stringify(error));
137
+ };
138
+ const onAborted = (req) => console.warn("REQUEST ABORTED:", req.getMethod(), req.getUrl());
139
+ this.app.options("/matchmake/*", (res, req) => {
140
+ res.onAborted(() => onAborted(req));
141
+ writeHeaders(res);
142
+ res.writeStatus("204 No Content");
143
+ res.end();
144
+ });
145
+ this.app.post("/matchmake/*", (res, req) => {
146
+ res.onAborted(() => onAborted(req));
147
+ writeHeaders(res);
148
+ res.writeHeader('Content-Type', 'application/json');
149
+ const url = req.getUrl();
150
+ const matchedParams = url.match(allowedRoomNameChars);
151
+ const matchmakeIndex = matchedParams.indexOf(matchmakeRoute);
152
+ // read json body
153
+ this.readJson(res, (clientOptions) => tslib_es6.__awaiter(this, void 0, void 0, function* () {
154
+ const method = matchedParams[matchmakeIndex + 1];
155
+ const name = matchedParams[matchmakeIndex + 2] || '';
156
+ try {
157
+ const response = yield core.matchMaker.controller.invokeMethod(method, name, clientOptions);
158
+ res.writeStatus("200 OK");
159
+ res.end(JSON.stringify(response));
160
+ }
161
+ catch (e) {
162
+ core.debugAndPrintError(e);
163
+ writeError(res, {
164
+ code: e.code || core.ErrorCode.MATCHMAKE_UNHANDLED,
165
+ error: e.message
166
+ });
167
+ }
168
+ }), () => {
169
+ writeError(res, {
170
+ code: core.ErrorCode.APPLICATION_ERROR,
171
+ error: "failed to read json body"
172
+ });
173
+ });
174
+ });
175
+ // this.app.any("/*", (res, req) => {
176
+ // res.onAborted(() => onAborted(req));
177
+ // res.writeStatus("200 OK");
178
+ // });
179
+ this.app.get("/matchmake/*", (res, req) => tslib_es6.__awaiter(this, void 0, void 0, function* () {
180
+ res.onAborted(() => onAborted(req));
181
+ writeHeaders(res);
182
+ res.writeHeader('Content-Type', 'application/json');
183
+ const url = req.getUrl();
184
+ const matchedParams = url.match(allowedRoomNameChars);
185
+ const roomName = matchedParams[matchedParams.length - 1];
186
+ try {
187
+ const response = yield core.matchMaker.controller.getAvailableRooms(roomName || '');
188
+ res.writeStatus("200 OK");
189
+ res.end(JSON.stringify(response));
190
+ }
191
+ catch (e) {
192
+ core.debugAndPrintError(e);
193
+ writeError(res, {
194
+ code: e.code || core.ErrorCode.MATCHMAKE_UNHANDLED,
195
+ error: e.message
196
+ });
197
+ }
198
+ }));
199
+ }
200
+ /* Helper function for reading a posted JSON body */
201
+ /* Extracted from https://github.com/uNetworking/uWebSockets.js/blob/master/examples/JsonPost.js */
202
+ readJson(res, cb, err) {
203
+ let buffer;
204
+ /* Register data cb */
205
+ res.onData((ab, isLast) => {
206
+ let chunk = Buffer.from(ab);
207
+ if (isLast) {
208
+ let json;
209
+ if (buffer) {
210
+ try {
211
+ // @ts-ignore
212
+ json = JSON.parse(Buffer.concat([buffer, chunk]));
213
+ }
214
+ catch (e) {
215
+ /* res.close calls onAborted */
216
+ res.close();
217
+ return;
218
+ }
219
+ cb(json);
220
+ }
221
+ else {
222
+ try {
223
+ // @ts-ignore
224
+ json = JSON.parse(chunk);
225
+ }
226
+ catch (e) {
227
+ /* res.close calls onAborted */
228
+ res.close();
229
+ return;
230
+ }
231
+ cb(json);
232
+ }
233
+ }
234
+ else {
235
+ if (buffer) {
236
+ buffer = Buffer.concat([buffer, chunk]);
237
+ }
238
+ else {
239
+ buffer = Buffer.concat([chunk]);
240
+ }
241
+ }
242
+ });
243
+ /* Register error cb */
244
+ res.onAborted(err);
245
+ }
246
+ }
247
+
248
+ exports.uWebSocketsTransport = uWebSocketsTransport;
249
+ //# sourceMappingURL=uWebSocketsTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uWebSocketsTransport.js","sources":["../../../../../src/uWebSocketsTransport.ts"],"sourcesContent":["import http from 'http';\nimport querystring from 'querystring';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { ErrorCode, matchMaker, Transport, debugAndPrintError, spliceOne } from '@colyseus/core';\nimport { uWebSocketClient, uWebSocketWrapper } from './uWebSocketClient';\n\nexport type TransportOptions = Omit<uWebSockets.WebSocketBehavior, \"upgrade\" | \"open\" | \"pong\" | \"close\" | \"message\">;\n\ntype RawWebSocketClient = uWebSockets.WebSocket & {\n headers: {[key: string]: string},\n connection: { remoteAddress: string },\n};\n\nexport class uWebSocketsTransport extends Transport {\n public app: uWebSockets.TemplatedApp;\n\n protected clients: RawWebSocketClient[] = [];\n protected clientWrappers = new WeakMap<RawWebSocketClient, uWebSocketWrapper>();\n\n private _listeningSocket: any;\n\n constructor(options: TransportOptions = {}, appOptions: uWebSockets.AppOptions = {}) {\n super();\n\n this.app = (appOptions.cert_file_name && appOptions.key_file_name)\n ? uWebSockets.SSLApp(appOptions)\n : uWebSockets.App(appOptions);\n\n if (!options.maxBackpressure) {\n options.maxBackpressure = 1024 * 1024;\n }\n\n if (!options.compression) {\n options.compression = uWebSockets.DISABLED;\n }\n\n if (!options.maxPayloadLength) {\n options.maxPayloadLength = 1024 * 1024;\n }\n\n this.app.ws('/*', {\n ...options,\n\n upgrade: (res, req, context) => {\n // get all headers\n const headers: {[id: string]: string} = {};\n req.forEach((key, value) => headers[key] = value);\n\n /* This immediately calls open handler, you must not use res after this call */\n /* Spell these correctly */\n res.upgrade(\n {\n url: req.getUrl(),\n query: req.getQuery(),\n\n // compatibility with @colyseus/ws-transport\n headers,\n connection: {\n remoteAddress: Buffer.from(res.getRemoteAddressAsText()).toString()\n }\n },\n req.getHeader('sec-websocket-key'),\n req.getHeader('sec-websocket-protocol'),\n req.getHeader('sec-websocket-extensions'),\n context\n );\n },\n\n open: async (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n await this.onConnection(ws);\n },\n\n // pong: (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n // },\n\n close: (ws: RawWebSocketClient, code: number, message: ArrayBuffer) => {\n // remove from client list\n spliceOne(this.clients, this.clients.indexOf(ws));\n\n const clientWrapper = this.clientWrappers.get(ws);\n if (clientWrapper) {\n this.clientWrappers.delete(ws);\n\n // emit 'close' on wrapper\n clientWrapper.emit('close', code);\n }\n },\n\n message: (ws: RawWebSocketClient, message: ArrayBuffer, isBinary: boolean) => {\n // emit 'close' on wrapper\n this.clientWrappers.get(ws)?.emit('message', Buffer.from(message.slice(0)));\n },\n\n });\n\n this.registerMatchMakeRequest();\n }\n\n public listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void) {\n this.app.listen(port, (listeningSocket: any) => {\n this._listeningSocket = listeningSocket;\n listeningListener?.();\n });\n return this;\n }\n\n public shutdown() {\n if (this._listeningSocket) {\n uWebSockets.us_listen_socket_close(this._listeningSocket);\n }\n }\n\n public simulateLatency(milliseconds: number) {\n const originalRawSend = uWebSocketClient.prototype.raw;\n uWebSocketClient.prototype.raw = function() {\n setTimeout(() => originalRawSend.apply(this, arguments), milliseconds);\n }\n }\n\n protected async onConnection(rawClient: RawWebSocketClient) {\n const wrapper = new uWebSocketWrapper(rawClient);\n // keep reference to client and its wrapper\n this.clients.push(rawClient);\n this.clientWrappers.set(rawClient, wrapper);\n\n const query = rawClient.query;\n const url = rawClient.url;\n\n const sessionId = querystring.parse(query).sessionId as string;\n const processAndRoomId = url.match(/\\/[a-zA-Z0-9_\\-]+\\/([a-zA-Z0-9_\\-]+)$/);\n const roomId = processAndRoomId && processAndRoomId[1];\n\n const room = matchMaker.getRoomById(roomId);\n const client = new uWebSocketClient(sessionId, wrapper);\n\n //\n // TODO: DRY code below with all transports\n //\n\n try {\n if (!room || !room.hasReservedSeat(sessionId)) {\n throw new Error('seat reservation expired.');\n }\n\n await room._onJoin(client, rawClient as unknown as http.IncomingMessage);\n\n } catch (e) {\n debugAndPrintError(e);\n\n // send error code to client then terminate\n client.error(e.code, e.message, () => rawClient.close());\n }\n }\n\n protected registerMatchMakeRequest() {\n const headers = {\n 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',\n 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Max-Age': 2592000,\n // ...\n };\n\n // TODO: DRY with Server.ts\n const matchmakeRoute = 'matchmake';\n const allowedRoomNameChars = /([a-zA-Z_\\-0-9]+)/gi;\n\n const writeHeaders = (res: uWebSockets.HttpResponse) => {\n for (const header in headers) {\n res.writeHeader(header, headers[header].toString());\n }\n }\n\n const writeError = (res: uWebSockets.HttpResponse, error: { code: number, error: string }) => {\n res.writeStatus(\"406 Not Acceptable\");\n res.end(JSON.stringify(error));\n }\n\n const onAborted = (req: uWebSockets.HttpRequest) =>\n console.warn(\"REQUEST ABORTED:\", req.getMethod(), req.getUrl());\n\n this.app.options(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(req));\n\n writeHeaders(res);\n res.writeStatus(\"204 No Content\");\n res.end();\n });\n\n this.app.post(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(req));\n\n writeHeaders(res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const matchmakeIndex = matchedParams.indexOf(matchmakeRoute);\n\n // read json body\n this.readJson(res, async (clientOptions) => {\n\n const method = matchedParams[matchmakeIndex + 1];\n const name = matchedParams[matchmakeIndex + 2] || '';\n\n try {\n const response = await matchMaker.controller.invokeMethod(method, name, clientOptions);\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n\n }, () => {\n writeError(res, {\n code: ErrorCode.APPLICATION_ERROR,\n error: \"failed to read json body\"\n });\n })\n\n });\n\n // this.app.any(\"/*\", (res, req) => {\n // res.onAborted(() => onAborted(req));\n // res.writeStatus(\"200 OK\");\n // });\n\n this.app.get(\"/matchmake/*\", async (res, req) => {\n res.onAborted(() => onAborted(req));\n\n writeHeaders(res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const roomName = matchedParams[matchedParams.length - 1];\n\n try {\n const response = await matchMaker.controller.getAvailableRooms(roomName || '')\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n });\n }\n\n /* Helper function for reading a posted JSON body */\n /* Extracted from https://github.com/uNetworking/uWebSockets.js/blob/master/examples/JsonPost.js */\n private readJson(res: uWebSockets.HttpResponse, cb: (json: any) => void, err: () => void) {\n let buffer: any;\n /* Register data cb */\n res.onData((ab, isLast) => {\n let chunk = Buffer.from(ab);\n if (isLast) {\n let json;\n if (buffer) {\n try {\n // @ts-ignore\n json = JSON.parse(Buffer.concat([buffer, chunk]));\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n return;\n }\n cb(json);\n } else {\n try {\n // @ts-ignore\n json = JSON.parse(chunk);\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n return;\n }\n cb(json);\n }\n } else {\n if (buffer) {\n buffer = Buffer.concat([buffer, chunk]);\n } else {\n buffer = Buffer.concat([chunk]);\n }\n }\n });\n\n /* Register error cb */\n res.onAborted(err);\n }\n\n}\n"],"names":["Transport","uWebSockets","spliceOne","uWebSocketClient","uWebSocketWrapper","querystring","matchMaker","debugAndPrintError","ErrorCode"],"mappings":"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"}
@@ -17,10 +17,12 @@ export declare class uWebSocketClient implements Client {
17
17
  ref: uWebSocketWrapper;
18
18
  sessionId: string;
19
19
  state: ClientState;
20
+ readyState: number;
20
21
  _enqueuedMessages: any[];
21
22
  _afterNextPatchQueue: any;
22
- readyState: number;
23
+ _reconnectionToken: string;
23
24
  constructor(id: string, ref: uWebSocketWrapper);
25
+ sendBytes(type: any, bytes?: any | ISendOptions, options?: ISendOptions): void;
24
26
  send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions): void;
25
27
  enqueueRaw(data: ArrayLike<number>, options?: ISendOptions): void;
26
28
  raw(data: ArrayLike<number>, options?: ISendOptions, cb?: (err?: Error) => void): void;
@@ -29,19 +29,25 @@ class uWebSocketClient {
29
29
  ref;
30
30
  sessionId;
31
31
  state = core.ClientState.JOINING;
32
+ readyState = exports.ReadyState.OPEN;
32
33
  _enqueuedMessages = [];
33
34
  _afterNextPatchQueue;
34
- readyState = exports.ReadyState.OPEN;
35
+ _reconnectionToken;
35
36
  constructor(id, ref) {
36
37
  this.id = id;
37
38
  this.ref = ref;
38
39
  this.sessionId = id;
39
40
  ref.on('close', () => this.readyState = exports.ReadyState.CLOSED);
40
41
  }
42
+ sendBytes(type, bytes, options) {
43
+ core.debugMessage("send bytes(to %s): '%s' -> %j", this.sessionId, type, bytes);
44
+ this.enqueueRaw(core.getMessageBytes.raw(core.Protocol.ROOM_DATA_BYTES, type, undefined, bytes), options);
45
+ }
41
46
  send(messageOrType, messageOrOptions, options) {
47
+ core.debugMessage("send(to %s): '%s' -> %O", this.sessionId, messageOrType, messageOrOptions);
42
48
  this.enqueueRaw((messageOrType instanceof schema.Schema)
43
49
  ? core.getMessageBytes[core.Protocol.ROOM_DATA_SCHEMA](messageOrType)
44
- : core.getMessageBytes[core.Protocol.ROOM_DATA](messageOrType, messageOrOptions), options);
50
+ : core.getMessageBytes.raw(core.Protocol.ROOM_DATA, messageOrType, messageOrOptions), options);
45
51
  }
46
52
  enqueueRaw(data, options) {
47
53
  // use room's afterNextPatch queue
@@ -60,7 +66,7 @@ class uWebSocketClient {
60
66
  }
61
67
  raw(data, options, cb) {
62
68
  if (this.readyState !== exports.ReadyState.OPEN) {
63
- console.warn('trying to send data to inactive client', this.sessionId);
69
+ core.logger.warn('trying to send data to inactive client', this.sessionId);
64
70
  return;
65
71
  }
66
72
  this.ref.ws.send(new Uint8Array(data), true, false);
@@ -82,12 +88,12 @@ class uWebSocketClient {
82
88
  }
83
89
  }
84
90
  close(code, data) {
85
- console.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');
91
+ core.logger.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');
86
92
  try {
87
93
  throw new Error();
88
94
  }
89
95
  catch (e) {
90
- console.log(e.stack);
96
+ core.logger.info(e.stack);
91
97
  }
92
98
  this.leave(code, data);
93
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"uWebSocketClient.js","sources":["../src/uWebSocketClient.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { getMessageBytes, Protocol, Client, ClientState, ISendOptions } from '@colyseus/core';\nimport { Schema } from '@colyseus/schema';\n\nexport class uWebSocketWrapper extends EventEmitter {\n constructor(public ws: uWebSockets.WebSocket) {\n super();\n }\n}\n\nexport enum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\nexport class uWebSocketClient implements Client {\n public sessionId: string;\n public state: ClientState = ClientState.JOINING;\n public _enqueuedMessages: any[] = [];\n public _afterNextPatchQueue;\n public readyState: number = ReadyState.OPEN;\n\n constructor(\n public id: string,\n public ref: uWebSocketWrapper,\n ) {\n this.sessionId = id;\n\n ref.on('close', () => this.readyState = ReadyState.CLOSED);\n }\n\n public send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions) {\n this.enqueueRaw(\n (messageOrType instanceof Schema)\n ? getMessageBytes[Protocol.ROOM_DATA_SCHEMA](messageOrType)\n : getMessageBytes[Protocol.ROOM_DATA](messageOrType, messageOrOptions),\n options,\n );\n }\n\n public enqueueRaw(data: ArrayLike<number>, options?: ISendOptions) {\n // use room's afterNextPatch queue\n if (options?.afterNextPatch) {\n this._afterNextPatchQueue.push([this, arguments]);\n return;\n }\n\n if (this.state === ClientState.JOINING) {\n // sending messages during `onJoin`.\n // - the client-side cannot register \"onMessage\" callbacks at this point.\n // - enqueue the messages to be send after JOIN_ROOM message has been sent\n this._enqueuedMessages.push(data);\n return;\n }\n\n this.raw(data, options);\n }\n\n public raw(data: ArrayLike<number>, options?: ISendOptions, cb?: (err?: Error) => void) {\n if (this.readyState !== ReadyState.OPEN) {\n console.warn('trying to send data to inactive client', this.sessionId);\n return;\n }\n\n this.ref.ws.send(new Uint8Array(data), true, false);\n }\n\n public error(code: number, message: string = '', cb?: (err?: Error) => void) {\n this.raw(getMessageBytes[Protocol.ERROR](code, message), undefined, cb);\n }\n\n public leave(code?: number, data?: string) {\n if (this.readyState !== ReadyState.OPEN) {\n // connection already closed. ignore.\n return;\n }\n\n this.readyState = ReadyState.CLOSING;\n\n if (code !== undefined) {\n this.ref.ws.end(code, data);\n\n } else {\n this.ref.ws.close();\n }\n }\n\n public close(code?: number, data?: string) {\n console.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');\n try {\n throw new Error();\n } catch (e) {\n console.log(e.stack);\n }\n this.leave(code, data);\n }\n\n public toJSON() {\n return { sessionId: this.sessionId, readyState: this.readyState };\n }\n}\n"],"names":["EventEmitter","ReadyState","ClientState","Schema","getMessageBytes","Protocol"],"mappings":"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"}
1
+ {"version":3,"file":"uWebSocketClient.js","sources":["../src/uWebSocketClient.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { getMessageBytes, Protocol, Client, ClientState, ISendOptions, logger, debugMessage } from '@colyseus/core';\nimport { Schema } from '@colyseus/schema';\n\nexport class uWebSocketWrapper extends EventEmitter {\n constructor(public ws: uWebSockets.WebSocket) {\n super();\n }\n}\n\nexport enum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\nexport class uWebSocketClient implements Client {\n public sessionId: string;\n public state: ClientState = ClientState.JOINING;\n public readyState: number = ReadyState.OPEN;\n public _enqueuedMessages: any[] = [];\n public _afterNextPatchQueue;\n public _reconnectionToken: string;\n\n constructor(\n public id: string,\n public ref: uWebSocketWrapper,\n ) {\n this.sessionId = id;\n\n ref.on('close', () => this.readyState = ReadyState.CLOSED);\n }\n\n public sendBytes(type: any, bytes?: any | ISendOptions, options?: ISendOptions) {\n debugMessage(\"send bytes(to %s): '%s' -> %j\", this.sessionId, type, bytes);\n\n this.enqueueRaw(\n getMessageBytes.raw(Protocol.ROOM_DATA_BYTES, type, undefined, bytes),\n options,\n );\n }\n\n public send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions) {\n debugMessage(\"send(to %s): '%s' -> %O\", this.sessionId, messageOrType, messageOrOptions);\n\n this.enqueueRaw(\n (messageOrType instanceof Schema)\n ? getMessageBytes[Protocol.ROOM_DATA_SCHEMA](messageOrType)\n : getMessageBytes.raw(Protocol.ROOM_DATA, messageOrType, messageOrOptions),\n options,\n );\n }\n\n public enqueueRaw(data: ArrayLike<number>, options?: ISendOptions) {\n // use room's afterNextPatch queue\n if (options?.afterNextPatch) {\n this._afterNextPatchQueue.push([this, arguments]);\n return;\n }\n\n if (this.state === ClientState.JOINING) {\n // sending messages during `onJoin`.\n // - the client-side cannot register \"onMessage\" callbacks at this point.\n // - enqueue the messages to be send after JOIN_ROOM message has been sent\n this._enqueuedMessages.push(data);\n return;\n }\n\n this.raw(data, options);\n }\n\n public raw(data: ArrayLike<number>, options?: ISendOptions, cb?: (err?: Error) => void) {\n if (this.readyState !== ReadyState.OPEN) {\n logger.warn('trying to send data to inactive client', this.sessionId);\n return;\n }\n\n this.ref.ws.send(new Uint8Array(data), true, false);\n }\n\n public error(code: number, message: string = '', cb?: (err?: Error) => void) {\n this.raw(getMessageBytes[Protocol.ERROR](code, message), undefined, cb);\n }\n\n public leave(code?: number, data?: string) {\n if (this.readyState !== ReadyState.OPEN) {\n // connection already closed. ignore.\n return;\n }\n\n this.readyState = ReadyState.CLOSING;\n\n if (code !== undefined) {\n this.ref.ws.end(code, data);\n\n } else {\n this.ref.ws.close();\n }\n }\n\n public close(code?: number, data?: string) {\n logger.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');\n try {\n throw new Error();\n } catch (e) {\n logger.info(e.stack);\n }\n this.leave(code, data);\n }\n\n public toJSON() {\n return { sessionId: this.sessionId, readyState: this.readyState };\n }\n}\n"],"names":["EventEmitter","ReadyState","ClientState","debugMessage","getMessageBytes","Protocol","Schema","logger"],"mappings":";;;;;;;;;;;;MAMa,iBAAkB,SAAQA,gCAAY;IAC9B;IAAnB,YAAmB,EAAyB;QAC1C,KAAK,EAAE,CAAC;QADS,OAAE,GAAF,EAAE,CAAuB;KAE3C;CACF;AAEWC;AAAZ,WAAY,UAAU;IACpB,uDAAc,CAAA;IACd,2CAAQ,CAAA;IACR,iDAAW,CAAA;IACX,+CAAU,CAAA;AACZ,CAAC,EALWA,kBAAU,KAAVA,kBAAU,QAKrB;MAEY,gBAAgB;IASlB;IACA;IATF,SAAS,CAAS;IAClB,KAAK,GAAgBC,gBAAW,CAAC,OAAO,CAAC;IACzC,UAAU,GAAWD,kBAAU,CAAC,IAAI,CAAC;IACrC,iBAAiB,GAAU,EAAE,CAAC;IAC9B,oBAAoB,CAAC;IACrB,kBAAkB,CAAS;IAElC,YACS,EAAU,EACV,GAAsB;QADtB,OAAE,GAAF,EAAE,CAAQ;QACV,QAAG,GAAH,GAAG,CAAmB;QAE7B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAEpB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,GAAGA,kBAAU,CAAC,MAAM,CAAC,CAAC;KAC5D;IAEM,SAAS,CAAC,IAAS,EAAE,KAA0B,EAAE,OAAsB;QAC5EE,iBAAY,CAAC,+BAA+B,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAE3E,IAAI,CAAC,UAAU,CACbC,oBAAe,CAAC,GAAG,CAACC,aAAQ,CAAC,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EACrE,OAAO,CACR,CAAC;KACH;IAEM,IAAI,CAAC,aAAkB,EAAE,gBAAqC,EAAE,OAAsB;QAC3FF,iBAAY,CAAC,yBAAyB,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAEzF,IAAI,CAAC,UAAU,CACb,CAAC,aAAa,YAAYG,aAAM;cAC5BF,oBAAe,CAACC,aAAQ,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC;cACzDD,oBAAe,CAAC,GAAG,CAACC,aAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAC5E,OAAO,CACR,CAAC;KACH;IAEM,UAAU,CAAC,IAAuB,EAAE,OAAsB;;QAE/D,IAAI,OAAO,EAAE,cAAc,EAAE;YAC3B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YAClD,OAAO;SACR;QAED,IAAI,IAAI,CAAC,KAAK,KAAKH,gBAAW,CAAC,OAAO,EAAE;;;;YAItC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO;SACR;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KACzB;IAEM,GAAG,CAAC,IAAuB,EAAE,OAAsB,EAAE,EAA0B;QACpF,IAAI,IAAI,CAAC,UAAU,KAAKD,kBAAU,CAAC,IAAI,EAAE;YACvCM,WAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACtE,OAAO;SACR;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;KACrD;IAEM,KAAK,CAAC,IAAY,EAAE,UAAkB,EAAE,EAAE,EAA0B;QACzE,IAAI,CAAC,GAAG,CAACH,oBAAe,CAACC,aAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;KACzE;IAEM,KAAK,CAAC,IAAa,EAAE,IAAa;QACvC,IAAI,IAAI,CAAC,UAAU,KAAKJ,kBAAU,CAAC,IAAI,EAAE;;YAEvC,OAAO;SACR;QAED,IAAI,CAAC,UAAU,GAAGA,kBAAU,CAAC,OAAO,CAAC;QAErC,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SAE7B;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;SACrB;KACF;IAEM,KAAK,CAAC,IAAa,EAAE,IAAa;QACvCM,WAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QACjF,IAAI;YACF,MAAM,IAAI,KAAK,EAAE,CAAC;SACnB;QAAC,OAAO,CAAC,EAAE;YACVA,WAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACtB;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KACxB;IAEM,MAAM;QACX,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;KACnE;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import EventEmitter from 'events';
2
- import { ClientState, getMessageBytes, Protocol } from '@colyseus/core';
2
+ import { ClientState, debugMessage, getMessageBytes, Protocol, logger } from '@colyseus/core';
3
3
  import { Schema } from '@colyseus/schema';
4
4
 
5
5
  class uWebSocketWrapper extends EventEmitter {
@@ -21,19 +21,25 @@ class uWebSocketClient {
21
21
  ref;
22
22
  sessionId;
23
23
  state = ClientState.JOINING;
24
+ readyState = ReadyState.OPEN;
24
25
  _enqueuedMessages = [];
25
26
  _afterNextPatchQueue;
26
- readyState = ReadyState.OPEN;
27
+ _reconnectionToken;
27
28
  constructor(id, ref) {
28
29
  this.id = id;
29
30
  this.ref = ref;
30
31
  this.sessionId = id;
31
32
  ref.on('close', () => this.readyState = ReadyState.CLOSED);
32
33
  }
34
+ sendBytes(type, bytes, options) {
35
+ debugMessage("send bytes(to %s): '%s' -> %j", this.sessionId, type, bytes);
36
+ this.enqueueRaw(getMessageBytes.raw(Protocol.ROOM_DATA_BYTES, type, undefined, bytes), options);
37
+ }
33
38
  send(messageOrType, messageOrOptions, options) {
39
+ debugMessage("send(to %s): '%s' -> %O", this.sessionId, messageOrType, messageOrOptions);
34
40
  this.enqueueRaw((messageOrType instanceof Schema)
35
41
  ? getMessageBytes[Protocol.ROOM_DATA_SCHEMA](messageOrType)
36
- : getMessageBytes[Protocol.ROOM_DATA](messageOrType, messageOrOptions), options);
42
+ : getMessageBytes.raw(Protocol.ROOM_DATA, messageOrType, messageOrOptions), options);
37
43
  }
38
44
  enqueueRaw(data, options) {
39
45
  // use room's afterNextPatch queue
@@ -52,7 +58,7 @@ class uWebSocketClient {
52
58
  }
53
59
  raw(data, options, cb) {
54
60
  if (this.readyState !== ReadyState.OPEN) {
55
- console.warn('trying to send data to inactive client', this.sessionId);
61
+ logger.warn('trying to send data to inactive client', this.sessionId);
56
62
  return;
57
63
  }
58
64
  this.ref.ws.send(new Uint8Array(data), true, false);
@@ -74,12 +80,12 @@ class uWebSocketClient {
74
80
  }
75
81
  }
76
82
  close(code, data) {
77
- console.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');
83
+ logger.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');
78
84
  try {
79
85
  throw new Error();
80
86
  }
81
87
  catch (e) {
82
- console.log(e.stack);
88
+ logger.info(e.stack);
83
89
  }
84
90
  this.leave(code, data);
85
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"uWebSocketClient.mjs","sources":["../src/uWebSocketClient.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { getMessageBytes, Protocol, Client, ClientState, ISendOptions } from '@colyseus/core';\nimport { Schema } from '@colyseus/schema';\n\nexport class uWebSocketWrapper extends EventEmitter {\n constructor(public ws: uWebSockets.WebSocket) {\n super();\n }\n}\n\nexport enum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\nexport class uWebSocketClient implements Client {\n public sessionId: string;\n public state: ClientState = ClientState.JOINING;\n public _enqueuedMessages: any[] = [];\n public _afterNextPatchQueue;\n public readyState: number = ReadyState.OPEN;\n\n constructor(\n public id: string,\n public ref: uWebSocketWrapper,\n ) {\n this.sessionId = id;\n\n ref.on('close', () => this.readyState = ReadyState.CLOSED);\n }\n\n public send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions) {\n this.enqueueRaw(\n (messageOrType instanceof Schema)\n ? getMessageBytes[Protocol.ROOM_DATA_SCHEMA](messageOrType)\n : getMessageBytes[Protocol.ROOM_DATA](messageOrType, messageOrOptions),\n options,\n );\n }\n\n public enqueueRaw(data: ArrayLike<number>, options?: ISendOptions) {\n // use room's afterNextPatch queue\n if (options?.afterNextPatch) {\n this._afterNextPatchQueue.push([this, arguments]);\n return;\n }\n\n if (this.state === ClientState.JOINING) {\n // sending messages during `onJoin`.\n // - the client-side cannot register \"onMessage\" callbacks at this point.\n // - enqueue the messages to be send after JOIN_ROOM message has been sent\n this._enqueuedMessages.push(data);\n return;\n }\n\n this.raw(data, options);\n }\n\n public raw(data: ArrayLike<number>, options?: ISendOptions, cb?: (err?: Error) => void) {\n if (this.readyState !== ReadyState.OPEN) {\n console.warn('trying to send data to inactive client', this.sessionId);\n return;\n }\n\n this.ref.ws.send(new Uint8Array(data), true, false);\n }\n\n public error(code: number, message: string = '', cb?: (err?: Error) => void) {\n this.raw(getMessageBytes[Protocol.ERROR](code, message), undefined, cb);\n }\n\n public leave(code?: number, data?: string) {\n if (this.readyState !== ReadyState.OPEN) {\n // connection already closed. ignore.\n return;\n }\n\n this.readyState = ReadyState.CLOSING;\n\n if (code !== undefined) {\n this.ref.ws.end(code, data);\n\n } else {\n this.ref.ws.close();\n }\n }\n\n public close(code?: number, data?: string) {\n console.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');\n try {\n throw new Error();\n } catch (e) {\n console.log(e.stack);\n }\n this.leave(code, data);\n }\n\n public toJSON() {\n return { sessionId: this.sessionId, readyState: this.readyState };\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uWebSocketClient.mjs","sources":["../src/uWebSocketClient.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { getMessageBytes, Protocol, Client, ClientState, ISendOptions, logger, debugMessage } from '@colyseus/core';\nimport { Schema } from '@colyseus/schema';\n\nexport class uWebSocketWrapper extends EventEmitter {\n constructor(public ws: uWebSockets.WebSocket) {\n super();\n }\n}\n\nexport enum ReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3,\n}\n\nexport class uWebSocketClient implements Client {\n public sessionId: string;\n public state: ClientState = ClientState.JOINING;\n public readyState: number = ReadyState.OPEN;\n public _enqueuedMessages: any[] = [];\n public _afterNextPatchQueue;\n public _reconnectionToken: string;\n\n constructor(\n public id: string,\n public ref: uWebSocketWrapper,\n ) {\n this.sessionId = id;\n\n ref.on('close', () => this.readyState = ReadyState.CLOSED);\n }\n\n public sendBytes(type: any, bytes?: any | ISendOptions, options?: ISendOptions) {\n debugMessage(\"send bytes(to %s): '%s' -> %j\", this.sessionId, type, bytes);\n\n this.enqueueRaw(\n getMessageBytes.raw(Protocol.ROOM_DATA_BYTES, type, undefined, bytes),\n options,\n );\n }\n\n public send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions) {\n debugMessage(\"send(to %s): '%s' -> %O\", this.sessionId, messageOrType, messageOrOptions);\n\n this.enqueueRaw(\n (messageOrType instanceof Schema)\n ? getMessageBytes[Protocol.ROOM_DATA_SCHEMA](messageOrType)\n : getMessageBytes.raw(Protocol.ROOM_DATA, messageOrType, messageOrOptions),\n options,\n );\n }\n\n public enqueueRaw(data: ArrayLike<number>, options?: ISendOptions) {\n // use room's afterNextPatch queue\n if (options?.afterNextPatch) {\n this._afterNextPatchQueue.push([this, arguments]);\n return;\n }\n\n if (this.state === ClientState.JOINING) {\n // sending messages during `onJoin`.\n // - the client-side cannot register \"onMessage\" callbacks at this point.\n // - enqueue the messages to be send after JOIN_ROOM message has been sent\n this._enqueuedMessages.push(data);\n return;\n }\n\n this.raw(data, options);\n }\n\n public raw(data: ArrayLike<number>, options?: ISendOptions, cb?: (err?: Error) => void) {\n if (this.readyState !== ReadyState.OPEN) {\n logger.warn('trying to send data to inactive client', this.sessionId);\n return;\n }\n\n this.ref.ws.send(new Uint8Array(data), true, false);\n }\n\n public error(code: number, message: string = '', cb?: (err?: Error) => void) {\n this.raw(getMessageBytes[Protocol.ERROR](code, message), undefined, cb);\n }\n\n public leave(code?: number, data?: string) {\n if (this.readyState !== ReadyState.OPEN) {\n // connection already closed. ignore.\n return;\n }\n\n this.readyState = ReadyState.CLOSING;\n\n if (code !== undefined) {\n this.ref.ws.end(code, data);\n\n } else {\n this.ref.ws.close();\n }\n }\n\n public close(code?: number, data?: string) {\n logger.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');\n try {\n throw new Error();\n } catch (e) {\n logger.info(e.stack);\n }\n this.leave(code, data);\n }\n\n public toJSON() {\n return { sessionId: this.sessionId, readyState: this.readyState };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -31,6 +31,11 @@ class uWebSocketsTransport extends core.Transport {
31
31
  if (!options.maxPayloadLength) {
32
32
  options.maxPayloadLength = 1024 * 1024;
33
33
  }
34
+ // https://github.com/colyseus/colyseus/issues/458
35
+ // Adding a mock object for Transport.server
36
+ if (!this.server) {
37
+ this.server = new core.DummyServer();
38
+ }
34
39
  this.app.ws('/*', {
35
40
  ...options,
36
41
  upgrade: (res, req, context) => {
@@ -77,12 +82,14 @@ class uWebSocketsTransport extends core.Transport {
77
82
  this.app.listen(port, (listeningSocket) => {
78
83
  this._listeningSocket = listeningSocket;
79
84
  listeningListener?.();
85
+ this.server.emit("listening"); // Mocking Transport.server behaviour, https://github.com/colyseus/colyseus/issues/458
80
86
  });
81
87
  return this;
82
88
  }
83
89
  shutdown() {
84
90
  if (this._listeningSocket) {
85
91
  uWebSockets__default['default'].us_listen_socket_close(this._listeningSocket);
92
+ this.server.emit("close"); // Mocking Transport.server behaviour, https://github.com/colyseus/colyseus/issues/458
86
93
  }
87
94
  }
88
95
  simulateLatency(milliseconds) {
@@ -98,7 +105,8 @@ class uWebSocketsTransport extends core.Transport {
98
105
  this.clientWrappers.set(rawClient, wrapper);
99
106
  const query = rawClient.query;
100
107
  const url = rawClient.url;
101
- const sessionId = querystring__default['default'].parse(query).sessionId;
108
+ const searchParams = querystring__default['default'].parse(query);
109
+ const sessionId = searchParams.sessionId;
102
110
  const processAndRoomId = url.match(/\/[a-zA-Z0-9_\-]+\/([a-zA-Z0-9_\-]+)$/);
103
111
  const roomId = processAndRoomId && processAndRoomId[1];
104
112
  const room = core.matchMaker.getRoomById(roomId);
@@ -107,7 +115,7 @@ class uWebSocketsTransport extends core.Transport {
107
115
  // TODO: DRY code below with all transports
108
116
  //
109
117
  try {
110
- if (!room || !room.hasReservedSeat(sessionId)) {
118
+ if (!room || !room.hasReservedSeat(sessionId, searchParams.reconnectionToken)) {
111
119
  throw new Error('seat reservation expired.');
112
120
  }
113
121
  await room._onJoin(client, rawClient);
@@ -119,21 +127,15 @@ class uWebSocketsTransport extends core.Transport {
119
127
  }
120
128
  }
121
129
  registerMatchMakeRequest() {
122
- const headers = {
123
- 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
124
- 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',
125
- 'Access-Control-Allow-Origin': '*',
126
- 'Access-Control-Max-Age': 2592000,
127
- // ...
128
- };
129
130
  // TODO: DRY with Server.ts
130
131
  const matchmakeRoute = 'matchmake';
131
132
  const allowedRoomNameChars = /([a-zA-Z_\-0-9]+)/gi;
132
- const writeHeaders = (res) => {
133
+ const writeHeaders = (req, res) => {
133
134
  // skip if aborted
134
135
  if (res.aborted) {
135
136
  return;
136
137
  }
138
+ const headers = Object.assign({}, core.matchMaker.controller.DEFAULT_CORS_HEADERS, core.matchMaker.controller.getCorsHeaders.call(undefined, req));
137
139
  for (const header in headers) {
138
140
  res.writeHeader(header, headers[header].toString());
139
141
  }
@@ -152,14 +154,14 @@ class uWebSocketsTransport extends core.Transport {
152
154
  };
153
155
  this.app.options("/matchmake/*", (res, req) => {
154
156
  res.onAborted(() => onAborted(res));
155
- if (writeHeaders(res)) {
157
+ if (writeHeaders(req, res)) {
156
158
  res.writeStatus("204 No Content");
157
159
  res.end();
158
160
  }
159
161
  });
160
162
  this.app.post("/matchmake/*", (res, req) => {
161
163
  res.onAborted(() => onAborted(res));
162
- writeHeaders(res);
164
+ writeHeaders(req, res);
163
165
  res.writeHeader('Content-Type', 'application/json');
164
166
  const url = req.getUrl();
165
167
  const matchedParams = url.match(allowedRoomNameChars);
@@ -167,9 +169,9 @@ class uWebSocketsTransport extends core.Transport {
167
169
  // read json body
168
170
  this.readJson(res, async (clientOptions) => {
169
171
  const method = matchedParams[matchmakeIndex + 1];
170
- const name = matchedParams[matchmakeIndex + 2] || '';
172
+ const roomName = matchedParams[matchmakeIndex + 2] || '';
171
173
  try {
172
- const response = await core.matchMaker.controller.invokeMethod(method, name, clientOptions);
174
+ const response = await core.matchMaker.controller.invokeMethod(method, roomName, clientOptions);
173
175
  if (!res.aborted) {
174
176
  res.writeStatus("200 OK");
175
177
  res.end(JSON.stringify(response));
@@ -190,7 +192,7 @@ class uWebSocketsTransport extends core.Transport {
190
192
  // });
191
193
  this.app.get("/matchmake/*", async (res, req) => {
192
194
  res.onAborted(() => onAborted(res));
193
- writeHeaders(res);
195
+ writeHeaders(req, res);
194
196
  res.writeHeader('Content-Type', 'application/json');
195
197
  const url = req.getUrl();
196
198
  const matchedParams = url.match(allowedRoomNameChars);
@@ -1 +1 @@
1
- {"version":3,"file":"uWebSocketsTransport.js","sources":["../src/uWebSocketsTransport.ts"],"sourcesContent":["import http from 'http';\nimport querystring from 'querystring';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { ErrorCode, matchMaker, Transport, debugAndPrintError, spliceOne } from '@colyseus/core';\nimport { uWebSocketClient, uWebSocketWrapper } from './uWebSocketClient';\n\nexport type TransportOptions = Omit<uWebSockets.WebSocketBehavior, \"upgrade\" | \"open\" | \"pong\" | \"close\" | \"message\">;\n\ntype RawWebSocketClient = uWebSockets.WebSocket & {\n headers: {[key: string]: string},\n connection: { remoteAddress: string },\n};\n\nexport class uWebSocketsTransport extends Transport {\n public app: uWebSockets.TemplatedApp;\n\n protected clients: RawWebSocketClient[] = [];\n protected clientWrappers = new WeakMap<RawWebSocketClient, uWebSocketWrapper>();\n\n private _listeningSocket: any;\n\n constructor(options: TransportOptions = {}, appOptions: uWebSockets.AppOptions = {}) {\n super();\n\n this.app = (appOptions.cert_file_name && appOptions.key_file_name)\n ? uWebSockets.SSLApp(appOptions)\n : uWebSockets.App(appOptions);\n\n if (!options.maxBackpressure) {\n options.maxBackpressure = 1024 * 1024;\n }\n\n if (!options.compression) {\n options.compression = uWebSockets.DISABLED;\n }\n\n if (!options.maxPayloadLength) {\n options.maxPayloadLength = 1024 * 1024;\n }\n\n this.app.ws('/*', {\n ...options,\n\n upgrade: (res, req, context) => {\n // get all headers\n const headers: {[id: string]: string} = {};\n req.forEach((key, value) => headers[key] = value);\n\n /* This immediately calls open handler, you must not use res after this call */\n /* Spell these correctly */\n res.upgrade(\n {\n url: req.getUrl(),\n query: req.getQuery(),\n\n // compatibility with @colyseus/ws-transport\n headers,\n connection: {\n remoteAddress: Buffer.from(res.getRemoteAddressAsText()).toString()\n }\n },\n req.getHeader('sec-websocket-key'),\n req.getHeader('sec-websocket-protocol'),\n req.getHeader('sec-websocket-extensions'),\n context\n );\n },\n\n open: async (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n await this.onConnection(ws);\n },\n\n // pong: (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n // },\n\n close: (ws: RawWebSocketClient, code: number, message: ArrayBuffer) => {\n // remove from client list\n spliceOne(this.clients, this.clients.indexOf(ws));\n\n const clientWrapper = this.clientWrappers.get(ws);\n if (clientWrapper) {\n this.clientWrappers.delete(ws);\n\n // emit 'close' on wrapper\n clientWrapper.emit('close', code);\n }\n },\n\n message: (ws: RawWebSocketClient, message: ArrayBuffer, isBinary: boolean) => {\n // emit 'close' on wrapper\n this.clientWrappers.get(ws)?.emit('message', Buffer.from(message.slice(0)));\n },\n\n });\n\n this.registerMatchMakeRequest();\n }\n\n public listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void) {\n this.app.listen(port, (listeningSocket: any) => {\n this._listeningSocket = listeningSocket;\n listeningListener?.();\n });\n return this;\n }\n\n public shutdown() {\n if (this._listeningSocket) {\n uWebSockets.us_listen_socket_close(this._listeningSocket);\n }\n }\n\n public simulateLatency(milliseconds: number) {\n const originalRawSend = uWebSocketClient.prototype.raw;\n uWebSocketClient.prototype.raw = function() {\n setTimeout(() => originalRawSend.apply(this, arguments), milliseconds);\n }\n }\n\n protected async onConnection(rawClient: RawWebSocketClient) {\n const wrapper = new uWebSocketWrapper(rawClient);\n // keep reference to client and its wrapper\n this.clients.push(rawClient);\n this.clientWrappers.set(rawClient, wrapper);\n\n const query = rawClient.query;\n const url = rawClient.url;\n\n const sessionId = querystring.parse(query).sessionId as string;\n const processAndRoomId = url.match(/\\/[a-zA-Z0-9_\\-]+\\/([a-zA-Z0-9_\\-]+)$/);\n const roomId = processAndRoomId && processAndRoomId[1];\n\n const room = matchMaker.getRoomById(roomId);\n const client = new uWebSocketClient(sessionId, wrapper);\n\n //\n // TODO: DRY code below with all transports\n //\n\n try {\n if (!room || !room.hasReservedSeat(sessionId)) {\n throw new Error('seat reservation expired.');\n }\n\n await room._onJoin(client, rawClient as unknown as http.IncomingMessage);\n\n } catch (e) {\n debugAndPrintError(e);\n\n // send error code to client then terminate\n client.error(e.code, e.message, () => rawClient.close());\n }\n }\n\n protected registerMatchMakeRequest() {\n const headers = {\n 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',\n 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Max-Age': 2592000,\n // ...\n };\n\n // TODO: DRY with Server.ts\n const matchmakeRoute = 'matchmake';\n const allowedRoomNameChars = /([a-zA-Z_\\-0-9]+)/gi;\n\n const writeHeaders = (res: uWebSockets.HttpResponse) => {\n // skip if aborted\n if (res.aborted) { return; }\n\n for (const header in headers) {\n res.writeHeader(header, headers[header].toString());\n }\n\n return true;\n }\n\n const writeError = (res: uWebSockets.HttpResponse, error: { code: number, error: string }) => {\n // skip if aborted\n if (res.aborted) { return; }\n\n res.writeStatus(\"406 Not Acceptable\");\n res.end(JSON.stringify(error));\n }\n\n const onAborted = (res: uWebSockets.HttpResponse) => {\n res.aborted = true;\n };\n\n this.app.options(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(res));\n\n if (writeHeaders(res)) {\n res.writeStatus(\"204 No Content\");\n res.end();\n }\n });\n\n this.app.post(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(res));\n\n writeHeaders(res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const matchmakeIndex = matchedParams.indexOf(matchmakeRoute);\n\n // read json body\n this.readJson(res, async (clientOptions) => {\n const method = matchedParams[matchmakeIndex + 1];\n const name = matchedParams[matchmakeIndex + 2] || '';\n\n try {\n const response = await matchMaker.controller.invokeMethod(method, name, clientOptions);\n if (!res.aborted) {\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n }\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n\n });\n });\n\n // this.app.any(\"/*\", (res, req) => {\n // res.onAborted(() => onAborted(req));\n // res.writeStatus(\"200 OK\");\n // });\n\n this.app.get(\"/matchmake/*\", async (res, req) => {\n res.onAborted(() => onAborted(res));\n\n writeHeaders(res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const roomName = matchedParams.length > 1 ? matchedParams[matchedParams.length - 1] : \"\";\n\n try {\n const response = await matchMaker.controller.getAvailableRooms(roomName || '')\n if (!res.aborted) {\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n }\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n });\n }\n\n /* Helper function for reading a posted JSON body */\n /* Extracted from https://github.com/uNetworking/uWebSockets.js/blob/master/examples/JsonPost.js */\n private readJson(res: uWebSockets.HttpResponse, cb: (json: any) => void) {\n let buffer: any;\n /* Register data cb */\n res.onData((ab, isLast) => {\n let chunk = Buffer.from(ab);\n if (isLast) {\n let json;\n if (buffer) {\n try {\n // @ts-ignore\n json = JSON.parse(Buffer.concat([buffer, chunk]));\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n cb(undefined);\n return;\n }\n cb(json);\n } else {\n try {\n // @ts-ignore\n json = JSON.parse(chunk);\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n cb(undefined);\n return;\n }\n cb(json);\n }\n } else {\n if (buffer) {\n buffer = Buffer.concat([buffer, chunk]);\n } else {\n buffer = Buffer.concat([chunk]);\n }\n }\n });\n }\n\n}\n"],"names":["Transport","uWebSockets","spliceOne","uWebSocketClient","uWebSocketWrapper","querystring","matchMaker","debugAndPrintError","ErrorCode"],"mappings":"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"}
1
+ {"version":3,"file":"uWebSocketsTransport.js","sources":["../src/uWebSocketsTransport.ts"],"sourcesContent":["import http from 'http';\nimport querystring from 'querystring';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { DummyServer, ErrorCode, matchMaker, Transport, debugAndPrintError, spliceOne } from '@colyseus/core';\nimport { uWebSocketClient, uWebSocketWrapper } from './uWebSocketClient';\n\nexport type TransportOptions = Omit<uWebSockets.WebSocketBehavior, \"upgrade\" | \"open\" | \"pong\" | \"close\" | \"message\">;\n\ntype RawWebSocketClient = uWebSockets.WebSocket & {\n headers: {[key: string]: string},\n connection: { remoteAddress: string },\n};\n\nexport class uWebSocketsTransport extends Transport {\n public app: uWebSockets.TemplatedApp;\n\n protected clients: RawWebSocketClient[] = [];\n protected clientWrappers = new WeakMap<RawWebSocketClient, uWebSocketWrapper>();\n\n private _listeningSocket: any;\n\n constructor(options: TransportOptions = {}, appOptions: uWebSockets.AppOptions = {}) {\n super();\n\n this.app = (appOptions.cert_file_name && appOptions.key_file_name)\n ? uWebSockets.SSLApp(appOptions)\n : uWebSockets.App(appOptions);\n\n if (!options.maxBackpressure) {\n options.maxBackpressure = 1024 * 1024;\n }\n\n if (!options.compression) {\n options.compression = uWebSockets.DISABLED;\n }\n\n if (!options.maxPayloadLength) {\n options.maxPayloadLength = 1024 * 1024;\n }\n\n // https://github.com/colyseus/colyseus/issues/458\n // Adding a mock object for Transport.server\n if(!this.server) {\n this.server = new DummyServer();\n }\n\n this.app.ws('/*', {\n ...options,\n\n upgrade: (res, req, context) => {\n // get all headers\n const headers: {[id: string]: string} = {};\n req.forEach((key, value) => headers[key] = value);\n\n /* This immediately calls open handler, you must not use res after this call */\n /* Spell these correctly */\n res.upgrade(\n {\n url: req.getUrl(),\n query: req.getQuery(),\n\n // compatibility with @colyseus/ws-transport\n headers,\n connection: {\n remoteAddress: Buffer.from(res.getRemoteAddressAsText()).toString()\n }\n },\n req.getHeader('sec-websocket-key'),\n req.getHeader('sec-websocket-protocol'),\n req.getHeader('sec-websocket-extensions'),\n context\n );\n },\n\n open: async (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n await this.onConnection(ws);\n },\n\n // pong: (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n // },\n\n close: (ws: RawWebSocketClient, code: number, message: ArrayBuffer) => {\n // remove from client list\n spliceOne(this.clients, this.clients.indexOf(ws));\n\n const clientWrapper = this.clientWrappers.get(ws);\n if (clientWrapper) {\n this.clientWrappers.delete(ws);\n\n // emit 'close' on wrapper\n clientWrapper.emit('close', code);\n }\n },\n\n message: (ws: RawWebSocketClient, message: ArrayBuffer, isBinary: boolean) => {\n // emit 'close' on wrapper\n this.clientWrappers.get(ws)?.emit('message', Buffer.from(message.slice(0)));\n },\n\n });\n\n this.registerMatchMakeRequest();\n }\n\n public listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void) {\n this.app.listen(port, (listeningSocket: any) => {\n this._listeningSocket = listeningSocket;\n listeningListener?.();\n this.server.emit(\"listening\"); // Mocking Transport.server behaviour, https://github.com/colyseus/colyseus/issues/458\n });\n return this;\n }\n\n public shutdown() {\n if (this._listeningSocket) {\n uWebSockets.us_listen_socket_close(this._listeningSocket);\n this.server.emit(\"close\"); // Mocking Transport.server behaviour, https://github.com/colyseus/colyseus/issues/458\n }\n }\n\n public simulateLatency(milliseconds: number) {\n const originalRawSend = uWebSocketClient.prototype.raw;\n uWebSocketClient.prototype.raw = function() {\n setTimeout(() => originalRawSend.apply(this, arguments), milliseconds);\n }\n }\n\n protected async onConnection(rawClient: RawWebSocketClient) {\n const wrapper = new uWebSocketWrapper(rawClient);\n // keep reference to client and its wrapper\n this.clients.push(rawClient);\n this.clientWrappers.set(rawClient, wrapper);\n\n const query = rawClient.query;\n const url = rawClient.url;\n const searchParams = querystring.parse(query);\n\n const sessionId = searchParams.sessionId as string;\n const processAndRoomId = url.match(/\\/[a-zA-Z0-9_\\-]+\\/([a-zA-Z0-9_\\-]+)$/);\n const roomId = processAndRoomId && processAndRoomId[1];\n\n const room = matchMaker.getRoomById(roomId);\n const client = new uWebSocketClient(sessionId, wrapper);\n\n //\n // TODO: DRY code below with all transports\n //\n\n try {\n if (!room || !room.hasReservedSeat(sessionId, searchParams.reconnectionToken as string)) {\n throw new Error('seat reservation expired.');\n }\n\n await room._onJoin(client, rawClient as unknown as http.IncomingMessage);\n\n } catch (e) {\n debugAndPrintError(e);\n\n // send error code to client then terminate\n client.error(e.code, e.message, () => rawClient.close());\n }\n }\n\n protected registerMatchMakeRequest() {\n\n // TODO: DRY with Server.ts\n const matchmakeRoute = 'matchmake';\n const allowedRoomNameChars = /([a-zA-Z_\\-0-9]+)/gi;\n\n const writeHeaders = (req: uWebSockets.HttpRequest, res: uWebSockets.HttpResponse) => {\n // skip if aborted\n if (res.aborted) { return; }\n\n const headers = Object.assign(\n {},\n matchMaker.controller.DEFAULT_CORS_HEADERS,\n matchMaker.controller.getCorsHeaders.call(undefined, req)\n );\n\n for (const header in headers) {\n res.writeHeader(header, headers[header].toString());\n }\n\n return true;\n }\n\n const writeError = (res: uWebSockets.HttpResponse, error: { code: number, error: string }) => {\n // skip if aborted\n if (res.aborted) { return; }\n\n res.writeStatus(\"406 Not Acceptable\");\n res.end(JSON.stringify(error));\n }\n\n const onAborted = (res: uWebSockets.HttpResponse) => {\n res.aborted = true;\n };\n\n this.app.options(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(res));\n\n if (writeHeaders(req, res)) {\n res.writeStatus(\"204 No Content\");\n res.end();\n }\n });\n\n this.app.post(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(res));\n\n writeHeaders(req, res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const matchmakeIndex = matchedParams.indexOf(matchmakeRoute);\n\n // read json body\n this.readJson(res, async (clientOptions) => {\n const method = matchedParams[matchmakeIndex + 1];\n const roomName = matchedParams[matchmakeIndex + 2] || '';\n\n try {\n const response = await matchMaker.controller.invokeMethod(method, roomName, clientOptions);\n if (!res.aborted) {\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n }\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n\n });\n });\n\n // this.app.any(\"/*\", (res, req) => {\n // res.onAborted(() => onAborted(req));\n // res.writeStatus(\"200 OK\");\n // });\n\n this.app.get(\"/matchmake/*\", async (res, req) => {\n res.onAborted(() => onAborted(res));\n\n writeHeaders(req, res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const roomName = matchedParams.length > 1 ? matchedParams[matchedParams.length - 1] : \"\";\n\n try {\n const response = await matchMaker.controller.getAvailableRooms(roomName || '')\n if (!res.aborted) {\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n }\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n });\n }\n\n /* Helper function for reading a posted JSON body */\n /* Extracted from https://github.com/uNetworking/uWebSockets.js/blob/master/examples/JsonPost.js */\n private readJson(res: uWebSockets.HttpResponse, cb: (json: any) => void) {\n let buffer: any;\n /* Register data cb */\n res.onData((ab, isLast) => {\n let chunk = Buffer.from(ab);\n if (isLast) {\n let json;\n if (buffer) {\n try {\n // @ts-ignore\n json = JSON.parse(Buffer.concat([buffer, chunk]));\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n cb(undefined);\n return;\n }\n cb(json);\n } else {\n try {\n // @ts-ignore\n json = JSON.parse(chunk);\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n cb(undefined);\n return;\n }\n cb(json);\n }\n } else {\n if (buffer) {\n buffer = Buffer.concat([buffer, chunk]);\n } else {\n buffer = Buffer.concat([chunk]);\n }\n }\n });\n }\n}\n"],"names":["Transport","uWebSockets","DummyServer","spliceOne","uWebSocketClient","uWebSocketWrapper","querystring","matchMaker","debugAndPrintError","ErrorCode"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import querystring from 'querystring';
2
2
  import uWebSockets from 'uWebSockets.js';
3
- import { Transport, spliceOne, matchMaker, debugAndPrintError, ErrorCode } from '@colyseus/core';
3
+ import { Transport, DummyServer, spliceOne, matchMaker, debugAndPrintError, ErrorCode } from '@colyseus/core';
4
4
  import { uWebSocketClient, uWebSocketWrapper } from './uWebSocketClient.mjs';
5
5
 
6
6
  class uWebSocketsTransport extends Transport {
@@ -22,6 +22,11 @@ class uWebSocketsTransport extends Transport {
22
22
  if (!options.maxPayloadLength) {
23
23
  options.maxPayloadLength = 1024 * 1024;
24
24
  }
25
+ // https://github.com/colyseus/colyseus/issues/458
26
+ // Adding a mock object for Transport.server
27
+ if (!this.server) {
28
+ this.server = new DummyServer();
29
+ }
25
30
  this.app.ws('/*', {
26
31
  ...options,
27
32
  upgrade: (res, req, context) => {
@@ -68,12 +73,14 @@ class uWebSocketsTransport extends Transport {
68
73
  this.app.listen(port, (listeningSocket) => {
69
74
  this._listeningSocket = listeningSocket;
70
75
  listeningListener?.();
76
+ this.server.emit("listening"); // Mocking Transport.server behaviour, https://github.com/colyseus/colyseus/issues/458
71
77
  });
72
78
  return this;
73
79
  }
74
80
  shutdown() {
75
81
  if (this._listeningSocket) {
76
82
  uWebSockets.us_listen_socket_close(this._listeningSocket);
83
+ this.server.emit("close"); // Mocking Transport.server behaviour, https://github.com/colyseus/colyseus/issues/458
77
84
  }
78
85
  }
79
86
  simulateLatency(milliseconds) {
@@ -89,7 +96,8 @@ class uWebSocketsTransport extends Transport {
89
96
  this.clientWrappers.set(rawClient, wrapper);
90
97
  const query = rawClient.query;
91
98
  const url = rawClient.url;
92
- const sessionId = querystring.parse(query).sessionId;
99
+ const searchParams = querystring.parse(query);
100
+ const sessionId = searchParams.sessionId;
93
101
  const processAndRoomId = url.match(/\/[a-zA-Z0-9_\-]+\/([a-zA-Z0-9_\-]+)$/);
94
102
  const roomId = processAndRoomId && processAndRoomId[1];
95
103
  const room = matchMaker.getRoomById(roomId);
@@ -98,7 +106,7 @@ class uWebSocketsTransport extends Transport {
98
106
  // TODO: DRY code below with all transports
99
107
  //
100
108
  try {
101
- if (!room || !room.hasReservedSeat(sessionId)) {
109
+ if (!room || !room.hasReservedSeat(sessionId, searchParams.reconnectionToken)) {
102
110
  throw new Error('seat reservation expired.');
103
111
  }
104
112
  await room._onJoin(client, rawClient);
@@ -110,21 +118,15 @@ class uWebSocketsTransport extends Transport {
110
118
  }
111
119
  }
112
120
  registerMatchMakeRequest() {
113
- const headers = {
114
- 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
115
- 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',
116
- 'Access-Control-Allow-Origin': '*',
117
- 'Access-Control-Max-Age': 2592000,
118
- // ...
119
- };
120
121
  // TODO: DRY with Server.ts
121
122
  const matchmakeRoute = 'matchmake';
122
123
  const allowedRoomNameChars = /([a-zA-Z_\-0-9]+)/gi;
123
- const writeHeaders = (res) => {
124
+ const writeHeaders = (req, res) => {
124
125
  // skip if aborted
125
126
  if (res.aborted) {
126
127
  return;
127
128
  }
129
+ const headers = Object.assign({}, matchMaker.controller.DEFAULT_CORS_HEADERS, matchMaker.controller.getCorsHeaders.call(undefined, req));
128
130
  for (const header in headers) {
129
131
  res.writeHeader(header, headers[header].toString());
130
132
  }
@@ -143,14 +145,14 @@ class uWebSocketsTransport extends Transport {
143
145
  };
144
146
  this.app.options("/matchmake/*", (res, req) => {
145
147
  res.onAborted(() => onAborted(res));
146
- if (writeHeaders(res)) {
148
+ if (writeHeaders(req, res)) {
147
149
  res.writeStatus("204 No Content");
148
150
  res.end();
149
151
  }
150
152
  });
151
153
  this.app.post("/matchmake/*", (res, req) => {
152
154
  res.onAborted(() => onAborted(res));
153
- writeHeaders(res);
155
+ writeHeaders(req, res);
154
156
  res.writeHeader('Content-Type', 'application/json');
155
157
  const url = req.getUrl();
156
158
  const matchedParams = url.match(allowedRoomNameChars);
@@ -158,9 +160,9 @@ class uWebSocketsTransport extends Transport {
158
160
  // read json body
159
161
  this.readJson(res, async (clientOptions) => {
160
162
  const method = matchedParams[matchmakeIndex + 1];
161
- const name = matchedParams[matchmakeIndex + 2] || '';
163
+ const roomName = matchedParams[matchmakeIndex + 2] || '';
162
164
  try {
163
- const response = await matchMaker.controller.invokeMethod(method, name, clientOptions);
165
+ const response = await matchMaker.controller.invokeMethod(method, roomName, clientOptions);
164
166
  if (!res.aborted) {
165
167
  res.writeStatus("200 OK");
166
168
  res.end(JSON.stringify(response));
@@ -181,7 +183,7 @@ class uWebSocketsTransport extends Transport {
181
183
  // });
182
184
  this.app.get("/matchmake/*", async (res, req) => {
183
185
  res.onAborted(() => onAborted(res));
184
- writeHeaders(res);
186
+ writeHeaders(req, res);
185
187
  res.writeHeader('Content-Type', 'application/json');
186
188
  const url = req.getUrl();
187
189
  const matchedParams = url.match(allowedRoomNameChars);
@@ -1 +1 @@
1
- {"version":3,"file":"uWebSocketsTransport.mjs","sources":["../src/uWebSocketsTransport.ts"],"sourcesContent":["import http from 'http';\nimport querystring from 'querystring';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { ErrorCode, matchMaker, Transport, debugAndPrintError, spliceOne } from '@colyseus/core';\nimport { uWebSocketClient, uWebSocketWrapper } from './uWebSocketClient';\n\nexport type TransportOptions = Omit<uWebSockets.WebSocketBehavior, \"upgrade\" | \"open\" | \"pong\" | \"close\" | \"message\">;\n\ntype RawWebSocketClient = uWebSockets.WebSocket & {\n headers: {[key: string]: string},\n connection: { remoteAddress: string },\n};\n\nexport class uWebSocketsTransport extends Transport {\n public app: uWebSockets.TemplatedApp;\n\n protected clients: RawWebSocketClient[] = [];\n protected clientWrappers = new WeakMap<RawWebSocketClient, uWebSocketWrapper>();\n\n private _listeningSocket: any;\n\n constructor(options: TransportOptions = {}, appOptions: uWebSockets.AppOptions = {}) {\n super();\n\n this.app = (appOptions.cert_file_name && appOptions.key_file_name)\n ? uWebSockets.SSLApp(appOptions)\n : uWebSockets.App(appOptions);\n\n if (!options.maxBackpressure) {\n options.maxBackpressure = 1024 * 1024;\n }\n\n if (!options.compression) {\n options.compression = uWebSockets.DISABLED;\n }\n\n if (!options.maxPayloadLength) {\n options.maxPayloadLength = 1024 * 1024;\n }\n\n this.app.ws('/*', {\n ...options,\n\n upgrade: (res, req, context) => {\n // get all headers\n const headers: {[id: string]: string} = {};\n req.forEach((key, value) => headers[key] = value);\n\n /* This immediately calls open handler, you must not use res after this call */\n /* Spell these correctly */\n res.upgrade(\n {\n url: req.getUrl(),\n query: req.getQuery(),\n\n // compatibility with @colyseus/ws-transport\n headers,\n connection: {\n remoteAddress: Buffer.from(res.getRemoteAddressAsText()).toString()\n }\n },\n req.getHeader('sec-websocket-key'),\n req.getHeader('sec-websocket-protocol'),\n req.getHeader('sec-websocket-extensions'),\n context\n );\n },\n\n open: async (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n await this.onConnection(ws);\n },\n\n // pong: (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n // },\n\n close: (ws: RawWebSocketClient, code: number, message: ArrayBuffer) => {\n // remove from client list\n spliceOne(this.clients, this.clients.indexOf(ws));\n\n const clientWrapper = this.clientWrappers.get(ws);\n if (clientWrapper) {\n this.clientWrappers.delete(ws);\n\n // emit 'close' on wrapper\n clientWrapper.emit('close', code);\n }\n },\n\n message: (ws: RawWebSocketClient, message: ArrayBuffer, isBinary: boolean) => {\n // emit 'close' on wrapper\n this.clientWrappers.get(ws)?.emit('message', Buffer.from(message.slice(0)));\n },\n\n });\n\n this.registerMatchMakeRequest();\n }\n\n public listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void) {\n this.app.listen(port, (listeningSocket: any) => {\n this._listeningSocket = listeningSocket;\n listeningListener?.();\n });\n return this;\n }\n\n public shutdown() {\n if (this._listeningSocket) {\n uWebSockets.us_listen_socket_close(this._listeningSocket);\n }\n }\n\n public simulateLatency(milliseconds: number) {\n const originalRawSend = uWebSocketClient.prototype.raw;\n uWebSocketClient.prototype.raw = function() {\n setTimeout(() => originalRawSend.apply(this, arguments), milliseconds);\n }\n }\n\n protected async onConnection(rawClient: RawWebSocketClient) {\n const wrapper = new uWebSocketWrapper(rawClient);\n // keep reference to client and its wrapper\n this.clients.push(rawClient);\n this.clientWrappers.set(rawClient, wrapper);\n\n const query = rawClient.query;\n const url = rawClient.url;\n\n const sessionId = querystring.parse(query).sessionId as string;\n const processAndRoomId = url.match(/\\/[a-zA-Z0-9_\\-]+\\/([a-zA-Z0-9_\\-]+)$/);\n const roomId = processAndRoomId && processAndRoomId[1];\n\n const room = matchMaker.getRoomById(roomId);\n const client = new uWebSocketClient(sessionId, wrapper);\n\n //\n // TODO: DRY code below with all transports\n //\n\n try {\n if (!room || !room.hasReservedSeat(sessionId)) {\n throw new Error('seat reservation expired.');\n }\n\n await room._onJoin(client, rawClient as unknown as http.IncomingMessage);\n\n } catch (e) {\n debugAndPrintError(e);\n\n // send error code to client then terminate\n client.error(e.code, e.message, () => rawClient.close());\n }\n }\n\n protected registerMatchMakeRequest() {\n const headers = {\n 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept',\n 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Max-Age': 2592000,\n // ...\n };\n\n // TODO: DRY with Server.ts\n const matchmakeRoute = 'matchmake';\n const allowedRoomNameChars = /([a-zA-Z_\\-0-9]+)/gi;\n\n const writeHeaders = (res: uWebSockets.HttpResponse) => {\n // skip if aborted\n if (res.aborted) { return; }\n\n for (const header in headers) {\n res.writeHeader(header, headers[header].toString());\n }\n\n return true;\n }\n\n const writeError = (res: uWebSockets.HttpResponse, error: { code: number, error: string }) => {\n // skip if aborted\n if (res.aborted) { return; }\n\n res.writeStatus(\"406 Not Acceptable\");\n res.end(JSON.stringify(error));\n }\n\n const onAborted = (res: uWebSockets.HttpResponse) => {\n res.aborted = true;\n };\n\n this.app.options(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(res));\n\n if (writeHeaders(res)) {\n res.writeStatus(\"204 No Content\");\n res.end();\n }\n });\n\n this.app.post(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(res));\n\n writeHeaders(res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const matchmakeIndex = matchedParams.indexOf(matchmakeRoute);\n\n // read json body\n this.readJson(res, async (clientOptions) => {\n const method = matchedParams[matchmakeIndex + 1];\n const name = matchedParams[matchmakeIndex + 2] || '';\n\n try {\n const response = await matchMaker.controller.invokeMethod(method, name, clientOptions);\n if (!res.aborted) {\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n }\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n\n });\n });\n\n // this.app.any(\"/*\", (res, req) => {\n // res.onAborted(() => onAborted(req));\n // res.writeStatus(\"200 OK\");\n // });\n\n this.app.get(\"/matchmake/*\", async (res, req) => {\n res.onAborted(() => onAborted(res));\n\n writeHeaders(res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const roomName = matchedParams.length > 1 ? matchedParams[matchedParams.length - 1] : \"\";\n\n try {\n const response = await matchMaker.controller.getAvailableRooms(roomName || '')\n if (!res.aborted) {\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n }\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n });\n }\n\n /* Helper function for reading a posted JSON body */\n /* Extracted from https://github.com/uNetworking/uWebSockets.js/blob/master/examples/JsonPost.js */\n private readJson(res: uWebSockets.HttpResponse, cb: (json: any) => void) {\n let buffer: any;\n /* Register data cb */\n res.onData((ab, isLast) => {\n let chunk = Buffer.from(ab);\n if (isLast) {\n let json;\n if (buffer) {\n try {\n // @ts-ignore\n json = JSON.parse(Buffer.concat([buffer, chunk]));\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n cb(undefined);\n return;\n }\n cb(json);\n } else {\n try {\n // @ts-ignore\n json = JSON.parse(chunk);\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n cb(undefined);\n return;\n }\n cb(json);\n }\n } else {\n if (buffer) {\n buffer = Buffer.concat([buffer, chunk]);\n } else {\n buffer = Buffer.concat([chunk]);\n }\n }\n });\n }\n\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uWebSocketsTransport.mjs","sources":["../src/uWebSocketsTransport.ts"],"sourcesContent":["import http from 'http';\nimport querystring from 'querystring';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { DummyServer, ErrorCode, matchMaker, Transport, debugAndPrintError, spliceOne } from '@colyseus/core';\nimport { uWebSocketClient, uWebSocketWrapper } from './uWebSocketClient';\n\nexport type TransportOptions = Omit<uWebSockets.WebSocketBehavior, \"upgrade\" | \"open\" | \"pong\" | \"close\" | \"message\">;\n\ntype RawWebSocketClient = uWebSockets.WebSocket & {\n headers: {[key: string]: string},\n connection: { remoteAddress: string },\n};\n\nexport class uWebSocketsTransport extends Transport {\n public app: uWebSockets.TemplatedApp;\n\n protected clients: RawWebSocketClient[] = [];\n protected clientWrappers = new WeakMap<RawWebSocketClient, uWebSocketWrapper>();\n\n private _listeningSocket: any;\n\n constructor(options: TransportOptions = {}, appOptions: uWebSockets.AppOptions = {}) {\n super();\n\n this.app = (appOptions.cert_file_name && appOptions.key_file_name)\n ? uWebSockets.SSLApp(appOptions)\n : uWebSockets.App(appOptions);\n\n if (!options.maxBackpressure) {\n options.maxBackpressure = 1024 * 1024;\n }\n\n if (!options.compression) {\n options.compression = uWebSockets.DISABLED;\n }\n\n if (!options.maxPayloadLength) {\n options.maxPayloadLength = 1024 * 1024;\n }\n\n // https://github.com/colyseus/colyseus/issues/458\n // Adding a mock object for Transport.server\n if(!this.server) {\n this.server = new DummyServer();\n }\n\n this.app.ws('/*', {\n ...options,\n\n upgrade: (res, req, context) => {\n // get all headers\n const headers: {[id: string]: string} = {};\n req.forEach((key, value) => headers[key] = value);\n\n /* This immediately calls open handler, you must not use res after this call */\n /* Spell these correctly */\n res.upgrade(\n {\n url: req.getUrl(),\n query: req.getQuery(),\n\n // compatibility with @colyseus/ws-transport\n headers,\n connection: {\n remoteAddress: Buffer.from(res.getRemoteAddressAsText()).toString()\n }\n },\n req.getHeader('sec-websocket-key'),\n req.getHeader('sec-websocket-protocol'),\n req.getHeader('sec-websocket-extensions'),\n context\n );\n },\n\n open: async (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n await this.onConnection(ws);\n },\n\n // pong: (ws: RawWebSocketClient) => {\n // ws.pingCount = 0;\n // },\n\n close: (ws: RawWebSocketClient, code: number, message: ArrayBuffer) => {\n // remove from client list\n spliceOne(this.clients, this.clients.indexOf(ws));\n\n const clientWrapper = this.clientWrappers.get(ws);\n if (clientWrapper) {\n this.clientWrappers.delete(ws);\n\n // emit 'close' on wrapper\n clientWrapper.emit('close', code);\n }\n },\n\n message: (ws: RawWebSocketClient, message: ArrayBuffer, isBinary: boolean) => {\n // emit 'close' on wrapper\n this.clientWrappers.get(ws)?.emit('message', Buffer.from(message.slice(0)));\n },\n\n });\n\n this.registerMatchMakeRequest();\n }\n\n public listen(port: number, hostname?: string, backlog?: number, listeningListener?: () => void) {\n this.app.listen(port, (listeningSocket: any) => {\n this._listeningSocket = listeningSocket;\n listeningListener?.();\n this.server.emit(\"listening\"); // Mocking Transport.server behaviour, https://github.com/colyseus/colyseus/issues/458\n });\n return this;\n }\n\n public shutdown() {\n if (this._listeningSocket) {\n uWebSockets.us_listen_socket_close(this._listeningSocket);\n this.server.emit(\"close\"); // Mocking Transport.server behaviour, https://github.com/colyseus/colyseus/issues/458\n }\n }\n\n public simulateLatency(milliseconds: number) {\n const originalRawSend = uWebSocketClient.prototype.raw;\n uWebSocketClient.prototype.raw = function() {\n setTimeout(() => originalRawSend.apply(this, arguments), milliseconds);\n }\n }\n\n protected async onConnection(rawClient: RawWebSocketClient) {\n const wrapper = new uWebSocketWrapper(rawClient);\n // keep reference to client and its wrapper\n this.clients.push(rawClient);\n this.clientWrappers.set(rawClient, wrapper);\n\n const query = rawClient.query;\n const url = rawClient.url;\n const searchParams = querystring.parse(query);\n\n const sessionId = searchParams.sessionId as string;\n const processAndRoomId = url.match(/\\/[a-zA-Z0-9_\\-]+\\/([a-zA-Z0-9_\\-]+)$/);\n const roomId = processAndRoomId && processAndRoomId[1];\n\n const room = matchMaker.getRoomById(roomId);\n const client = new uWebSocketClient(sessionId, wrapper);\n\n //\n // TODO: DRY code below with all transports\n //\n\n try {\n if (!room || !room.hasReservedSeat(sessionId, searchParams.reconnectionToken as string)) {\n throw new Error('seat reservation expired.');\n }\n\n await room._onJoin(client, rawClient as unknown as http.IncomingMessage);\n\n } catch (e) {\n debugAndPrintError(e);\n\n // send error code to client then terminate\n client.error(e.code, e.message, () => rawClient.close());\n }\n }\n\n protected registerMatchMakeRequest() {\n\n // TODO: DRY with Server.ts\n const matchmakeRoute = 'matchmake';\n const allowedRoomNameChars = /([a-zA-Z_\\-0-9]+)/gi;\n\n const writeHeaders = (req: uWebSockets.HttpRequest, res: uWebSockets.HttpResponse) => {\n // skip if aborted\n if (res.aborted) { return; }\n\n const headers = Object.assign(\n {},\n matchMaker.controller.DEFAULT_CORS_HEADERS,\n matchMaker.controller.getCorsHeaders.call(undefined, req)\n );\n\n for (const header in headers) {\n res.writeHeader(header, headers[header].toString());\n }\n\n return true;\n }\n\n const writeError = (res: uWebSockets.HttpResponse, error: { code: number, error: string }) => {\n // skip if aborted\n if (res.aborted) { return; }\n\n res.writeStatus(\"406 Not Acceptable\");\n res.end(JSON.stringify(error));\n }\n\n const onAborted = (res: uWebSockets.HttpResponse) => {\n res.aborted = true;\n };\n\n this.app.options(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(res));\n\n if (writeHeaders(req, res)) {\n res.writeStatus(\"204 No Content\");\n res.end();\n }\n });\n\n this.app.post(\"/matchmake/*\", (res, req) => {\n res.onAborted(() => onAborted(res));\n\n writeHeaders(req, res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const matchmakeIndex = matchedParams.indexOf(matchmakeRoute);\n\n // read json body\n this.readJson(res, async (clientOptions) => {\n const method = matchedParams[matchmakeIndex + 1];\n const roomName = matchedParams[matchmakeIndex + 2] || '';\n\n try {\n const response = await matchMaker.controller.invokeMethod(method, roomName, clientOptions);\n if (!res.aborted) {\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n }\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n\n });\n });\n\n // this.app.any(\"/*\", (res, req) => {\n // res.onAborted(() => onAborted(req));\n // res.writeStatus(\"200 OK\");\n // });\n\n this.app.get(\"/matchmake/*\", async (res, req) => {\n res.onAborted(() => onAborted(res));\n\n writeHeaders(req, res);\n res.writeHeader('Content-Type', 'application/json');\n\n const url = req.getUrl();\n const matchedParams = url.match(allowedRoomNameChars);\n const roomName = matchedParams.length > 1 ? matchedParams[matchedParams.length - 1] : \"\";\n\n try {\n const response = await matchMaker.controller.getAvailableRooms(roomName || '')\n if (!res.aborted) {\n res.writeStatus(\"200 OK\");\n res.end(JSON.stringify(response));\n }\n\n } catch (e) {\n debugAndPrintError(e);\n writeError(res, {\n code: e.code || ErrorCode.MATCHMAKE_UNHANDLED,\n error: e.message\n });\n }\n });\n }\n\n /* Helper function for reading a posted JSON body */\n /* Extracted from https://github.com/uNetworking/uWebSockets.js/blob/master/examples/JsonPost.js */\n private readJson(res: uWebSockets.HttpResponse, cb: (json: any) => void) {\n let buffer: any;\n /* Register data cb */\n res.onData((ab, isLast) => {\n let chunk = Buffer.from(ab);\n if (isLast) {\n let json;\n if (buffer) {\n try {\n // @ts-ignore\n json = JSON.parse(Buffer.concat([buffer, chunk]));\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n cb(undefined);\n return;\n }\n cb(json);\n } else {\n try {\n // @ts-ignore\n json = JSON.parse(chunk);\n } catch (e) {\n /* res.close calls onAborted */\n res.close();\n cb(undefined);\n return;\n }\n cb(json);\n }\n } else {\n if (buffer) {\n buffer = Buffer.concat([buffer, chunk]);\n } else {\n buffer = Buffer.concat([chunk]);\n }\n }\n });\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@colyseus/uwebsockets-transport",
3
- "version": "0.14.26",
3
+ "version": "0.15.0-preview.1",
4
4
  "input": "./src/index.ts",
5
5
  "main": "./build/index.js",
6
6
  "module": "./build/index.mjs",
7
7
  "typings": "./build/index.d.ts",
8
8
  "dependencies": {
9
- "@colyseus/core": "^0.14.20",
10
- "@colyseus/schema": "^1.0.15",
9
+ "@colyseus/core": "^0.15.0-preview.2",
10
+ "@colyseus/schema": "^2.0.0",
11
11
  "uWebSockets.js": "github:uNetworking/uWebSockets.js#v19.2.0"
12
12
  },
13
13
  "author": "Endel Dreyer",
@@ -32,5 +32,5 @@
32
32
  "publishConfig": {
33
33
  "access": "public"
34
34
  },
35
- "gitHead": "320a0325f01eff3cd7afa8fb2efa80077ebdbf4a"
35
+ "gitHead": "50c7cac08e2fb7d17aa5bd57c45a7dad9be84722"
36
36
  }