@colyseus/core 0.16.23 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/build/Debug.js +16 -4
  2. package/build/Debug.js.map +2 -2
  3. package/build/Debug.mjs +11 -1
  4. package/build/Debug.mjs.map +2 -2
  5. package/build/IPC.js +5 -3
  6. package/build/IPC.js.map +2 -2
  7. package/build/IPC.mjs +1 -0
  8. package/build/IPC.mjs.map +2 -2
  9. package/build/Logger.js +1 -0
  10. package/build/Logger.js.map +1 -1
  11. package/build/MatchMaker.js +148 -84
  12. package/build/MatchMaker.js.map +3 -3
  13. package/build/MatchMaker.mjs +130 -70
  14. package/build/MatchMaker.mjs.map +3 -3
  15. package/build/Protocol.js +54 -41
  16. package/build/Protocol.js.map +3 -3
  17. package/build/Protocol.mjs +52 -41
  18. package/build/Protocol.mjs.map +3 -3
  19. package/build/Room.js +430 -195
  20. package/build/Room.js.map +3 -3
  21. package/build/Room.mjs +417 -175
  22. package/build/Room.mjs.map +3 -3
  23. package/build/Server.js +48 -108
  24. package/build/Server.js.map +3 -3
  25. package/build/Server.mjs +39 -102
  26. package/build/Server.mjs.map +3 -3
  27. package/build/Stats.js +2 -1
  28. package/build/Stats.js.map +2 -2
  29. package/build/Stats.mjs.map +1 -1
  30. package/build/Transport.js +29 -11
  31. package/build/Transport.js.map +3 -3
  32. package/build/Transport.mjs +15 -9
  33. package/build/Transport.mjs.map +3 -3
  34. package/build/errors/RoomExceptions.js +9 -5
  35. package/build/errors/RoomExceptions.js.map +2 -2
  36. package/build/errors/RoomExceptions.mjs +8 -5
  37. package/build/errors/RoomExceptions.mjs.map +2 -2
  38. package/build/errors/SeatReservationError.js +1 -0
  39. package/build/errors/SeatReservationError.js.map +1 -1
  40. package/build/errors/ServerError.js +2 -1
  41. package/build/errors/ServerError.js.map +2 -2
  42. package/build/errors/ServerError.mjs.map +1 -1
  43. package/build/index.js +60 -26
  44. package/build/index.js.map +2 -2
  45. package/build/index.mjs +33 -7
  46. package/build/index.mjs.map +2 -2
  47. package/build/matchmaker/Lobby.js +13 -3
  48. package/build/matchmaker/Lobby.js.map +2 -2
  49. package/build/matchmaker/Lobby.mjs +11 -2
  50. package/build/matchmaker/Lobby.mjs.map +2 -2
  51. package/build/matchmaker/LocalDriver/LocalDriver.js +94 -0
  52. package/build/matchmaker/LocalDriver/LocalDriver.js.map +7 -0
  53. package/build/matchmaker/LocalDriver/LocalDriver.mjs +71 -0
  54. package/build/matchmaker/LocalDriver/LocalDriver.mjs.map +7 -0
  55. package/build/matchmaker/LocalDriver/Query.js +111 -0
  56. package/build/matchmaker/LocalDriver/Query.js.map +7 -0
  57. package/build/matchmaker/LocalDriver/Query.mjs +88 -0
  58. package/build/matchmaker/LocalDriver/Query.mjs.map +7 -0
  59. package/build/matchmaker/RegisteredHandler.js +57 -7
  60. package/build/matchmaker/RegisteredHandler.js.map +2 -2
  61. package/build/matchmaker/RegisteredHandler.mjs +54 -5
  62. package/build/matchmaker/RegisteredHandler.mjs.map +2 -2
  63. package/build/matchmaker/controller.js +8 -8
  64. package/build/matchmaker/controller.js.map +2 -2
  65. package/build/matchmaker/controller.mjs +4 -5
  66. package/build/matchmaker/controller.mjs.map +2 -2
  67. package/build/matchmaker/driver/api.js +21 -2
  68. package/build/matchmaker/driver/api.js.map +2 -2
  69. package/build/matchmaker/driver/api.mjs +18 -1
  70. package/build/matchmaker/driver/api.mjs.map +2 -2
  71. package/build/matchmaker/driver/local/LocalDriver.js +36 -7
  72. package/build/matchmaker/driver/local/LocalDriver.js.map +2 -2
  73. package/build/matchmaker/driver/local/LocalDriver.mjs +33 -5
  74. package/build/matchmaker/driver/local/LocalDriver.mjs.map +2 -2
  75. package/build/matchmaker/driver/local/Query.js +51 -18
  76. package/build/matchmaker/driver/local/Query.js.map +2 -2
  77. package/build/matchmaker/driver/local/Query.mjs +50 -18
  78. package/build/matchmaker/driver/local/Query.mjs.map +2 -2
  79. package/build/matchmaker/driver.js +44 -0
  80. package/build/matchmaker/driver.js.map +7 -0
  81. package/build/matchmaker/driver.mjs +20 -0
  82. package/build/matchmaker/driver.mjs.map +7 -0
  83. package/build/matchmaker/routes.js +79 -0
  84. package/build/matchmaker/routes.js.map +7 -0
  85. package/build/matchmaker/routes.mjs +45 -0
  86. package/build/matchmaker/routes.mjs.map +7 -0
  87. package/build/presence/LocalPresence.js +13 -27
  88. package/build/presence/LocalPresence.js.map +3 -3
  89. package/build/presence/LocalPresence.mjs +11 -16
  90. package/build/presence/LocalPresence.mjs.map +2 -2
  91. package/build/presence/Presence.js +37 -0
  92. package/build/presence/Presence.js.map +2 -2
  93. package/build/presence/Presence.mjs +29 -0
  94. package/build/presence/Presence.mjs.map +3 -3
  95. package/build/rooms/LobbyRoom.js +5 -5
  96. package/build/rooms/LobbyRoom.js.map +2 -2
  97. package/build/rooms/LobbyRoom.mjs +1 -2
  98. package/build/rooms/LobbyRoom.mjs.map +2 -2
  99. package/build/rooms/RankedQueueRoom.js +224 -0
  100. package/build/rooms/RankedQueueRoom.js.map +7 -0
  101. package/build/rooms/RankedQueueRoom.mjs +201 -0
  102. package/build/rooms/RankedQueueRoom.mjs.map +7 -0
  103. package/build/rooms/RelayRoom.js +6 -6
  104. package/build/rooms/RelayRoom.js.map +2 -2
  105. package/build/rooms/RelayRoom.mjs +4 -5
  106. package/build/rooms/RelayRoom.mjs.map +2 -2
  107. package/build/rooms/createRoom.js +51 -0
  108. package/build/rooms/createRoom.js.map +7 -0
  109. package/build/rooms/createRoom.mjs +28 -0
  110. package/build/rooms/createRoom.mjs.map +7 -0
  111. package/build/router/default_routes.js +79 -0
  112. package/build/router/default_routes.js.map +7 -0
  113. package/build/router/default_routes.mjs +45 -0
  114. package/build/router/default_routes.mjs.map +7 -0
  115. package/build/router/index.js +55 -0
  116. package/build/router/index.js.map +7 -0
  117. package/build/router/index.mjs +30 -0
  118. package/build/router/index.mjs.map +7 -0
  119. package/build/serializer/NoneSerializer.js +1 -0
  120. package/build/serializer/NoneSerializer.js.map +2 -2
  121. package/build/serializer/NoneSerializer.mjs.map +2 -2
  122. package/build/serializer/SchemaSerializer.js +6 -7
  123. package/build/serializer/SchemaSerializer.js.map +2 -2
  124. package/build/serializer/SchemaSerializer.mjs +3 -5
  125. package/build/serializer/SchemaSerializer.mjs.map +2 -2
  126. package/build/serializer/SchemaSerializerDebug.js +29 -0
  127. package/build/serializer/SchemaSerializerDebug.js.map +3 -3
  128. package/build/serializer/SchemaSerializerDebug.mjs +7 -0
  129. package/build/serializer/SchemaSerializerDebug.mjs.map +3 -3
  130. package/build/serializer/Serializer.js +1 -0
  131. package/build/serializer/Serializer.js.map +2 -2
  132. package/build/{Debug.d.ts → src/Debug.d.ts} +2 -1
  133. package/build/{IPC.d.ts → src/IPC.d.ts} +2 -2
  134. package/build/{MatchMaker.d.ts → src/MatchMaker.d.ts} +58 -33
  135. package/build/src/Protocol.d.ts +53 -0
  136. package/build/src/Room.d.ts +497 -0
  137. package/build/{Server.d.ts → src/Server.d.ts} +23 -25
  138. package/build/{Transport.d.ts → src/Transport.d.ts} +65 -22
  139. package/build/{errors → src/errors}/RoomExceptions.d.ts +8 -7
  140. package/build/src/index.d.ts +27 -0
  141. package/build/src/matchmaker/Lobby.d.ts +4 -0
  142. package/build/src/matchmaker/LocalDriver/LocalDriver.d.ts +17 -0
  143. package/build/src/matchmaker/LocalDriver/Query.d.ts +12 -0
  144. package/build/src/matchmaker/RegisteredHandler.d.ts +81 -0
  145. package/build/{matchmaker → src/matchmaker}/controller.d.ts +5 -6
  146. package/build/src/matchmaker/driver/api.d.ts +145 -0
  147. package/build/src/matchmaker/driver/local/LocalDriver.d.ts +17 -0
  148. package/build/src/matchmaker/driver/local/Query.d.ts +12 -0
  149. package/build/src/matchmaker/driver.d.ts +145 -0
  150. package/build/src/matchmaker/routes.d.ts +92 -0
  151. package/build/{presence → src/presence}/LocalPresence.d.ts +1 -1
  152. package/build/{presence → src/presence}/Presence.d.ts +2 -0
  153. package/build/{rooms → src/rooms}/LobbyRoom.d.ts +4 -4
  154. package/build/src/rooms/RankedQueueRoom.d.ts +125 -0
  155. package/build/{rooms → src/rooms}/RelayRoom.d.ts +5 -4
  156. package/build/src/rooms/createRoom.d.ts +65 -0
  157. package/build/src/router/default_routes.d.ts +103 -0
  158. package/build/src/router/index.d.ts +68 -0
  159. package/build/{serializer → src/serializer}/NoneSerializer.d.ts +2 -2
  160. package/build/{serializer → src/serializer}/SchemaSerializer.d.ts +9 -9
  161. package/build/{serializer → src/serializer}/Serializer.d.ts +3 -3
  162. package/build/{utils → src/utils}/DevMode.d.ts +5 -4
  163. package/build/{utils → src/utils}/StandardSchema.d.ts +1 -1
  164. package/build/{utils → src/utils}/Utils.d.ts +15 -4
  165. package/build/utils/DevMode.js +54 -26
  166. package/build/utils/DevMode.js.map +3 -3
  167. package/build/utils/DevMode.mjs +44 -19
  168. package/build/utils/DevMode.mjs.map +2 -2
  169. package/build/utils/StandardSchema.js.map +1 -1
  170. package/build/utils/StandardSchema.mjs.map +1 -1
  171. package/build/utils/Utils.js +8 -15
  172. package/build/utils/Utils.js.map +3 -3
  173. package/build/utils/Utils.mjs +6 -4
  174. package/build/utils/Utils.mjs.map +2 -2
  175. package/package.json +20 -14
  176. package/build/Protocol.d.ts +0 -37
  177. package/build/Room.d.ts +0 -265
  178. package/build/discovery/index.d.ts +0 -8
  179. package/build/discovery/index.js +0 -50
  180. package/build/discovery/index.js.map +0 -7
  181. package/build/discovery/index.mjs +0 -26
  182. package/build/discovery/index.mjs.map +0 -7
  183. package/build/index.d.ts +0 -24
  184. package/build/matchmaker/Lobby.d.ts +0 -4
  185. package/build/matchmaker/RegisteredHandler.d.ts +0 -19
  186. package/build/matchmaker/driver/Query.d.ts +0 -8
  187. package/build/matchmaker/driver/Query.js +0 -68
  188. package/build/matchmaker/driver/Query.js.map +0 -7
  189. package/build/matchmaker/driver/Query.mjs +0 -45
  190. package/build/matchmaker/driver/Query.mjs.map +0 -7
  191. package/build/matchmaker/driver/RoomData.d.ts +0 -19
  192. package/build/matchmaker/driver/RoomData.js +0 -79
  193. package/build/matchmaker/driver/RoomData.js.map +0 -7
  194. package/build/matchmaker/driver/RoomData.mjs +0 -56
  195. package/build/matchmaker/driver/RoomData.mjs.map +0 -7
  196. package/build/matchmaker/driver/api.d.ts +0 -104
  197. package/build/matchmaker/driver/index.d.ts +0 -13
  198. package/build/matchmaker/driver/index.js +0 -64
  199. package/build/matchmaker/driver/index.js.map +0 -7
  200. package/build/matchmaker/driver/index.mjs +0 -42
  201. package/build/matchmaker/driver/index.mjs.map +0 -7
  202. package/build/matchmaker/driver/interfaces.d.ts +0 -73
  203. package/build/matchmaker/driver/interfaces.js +0 -15
  204. package/build/matchmaker/driver/interfaces.js.map +0 -7
  205. package/build/matchmaker/driver/interfaces.mjs +0 -0
  206. package/build/matchmaker/driver/interfaces.mjs.map +0 -7
  207. package/build/matchmaker/driver/local/LocalDriver.d.ts +0 -13
  208. package/build/matchmaker/driver/local/Query.d.ts +0 -9
  209. package/build/matchmaker/driver/local/RoomData.d.ts +0 -19
  210. package/build/matchmaker/driver/local/RoomData.js +0 -79
  211. package/build/matchmaker/driver/local/RoomData.js.map +0 -7
  212. package/build/matchmaker/driver/local/RoomData.mjs +0 -57
  213. package/build/matchmaker/driver/local/RoomData.mjs.map +0 -7
  214. package/build/utils/types.d.ts +0 -1
  215. package/build/utils/types.js +0 -15
  216. package/build/utils/types.js.map +0 -7
  217. package/build/utils/types.mjs +0 -0
  218. package/build/utils/types.mjs.map +0 -7
  219. /package/build/{Logger.d.ts → src/Logger.d.ts} +0 -0
  220. /package/build/{Stats.d.ts → src/Stats.d.ts} +0 -0
  221. /package/build/{errors → src/errors}/SeatReservationError.d.ts +0 -0
  222. /package/build/{errors → src/errors}/ServerError.d.ts +0 -0
  223. /package/build/{serializer → src/serializer}/SchemaSerializerDebug.d.ts +0 -0
  224. /package/build/{utils → src/utils}/nanoevents.d.ts +0 -0
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -29,6 +30,8 @@ var MatchMaker_exports = {};
29
30
  __export(MatchMaker_exports, {
30
31
  MatchMakerState: () => MatchMakerState,
31
32
  accept: () => accept,
33
+ addRoomType: () => addRoomType,
34
+ buildSeatReservation: () => buildSeatReservation,
32
35
  controller: () => import_controller.default,
33
36
  create: () => create,
34
37
  createRoom: () => createRoom,
@@ -36,13 +39,13 @@ __export(MatchMaker_exports, {
36
39
  disconnectAll: () => disconnectAll,
37
40
  driver: () => driver,
38
41
  findOneRoomAvailable: () => findOneRoomAvailable,
42
+ getAllHandlers: () => getAllHandlers,
39
43
  getHandler: () => getHandler,
40
44
  getLocalRoomById: () => getLocalRoomById,
41
45
  getRoomById: () => getRoomById,
42
46
  getRoomClass: () => getRoomClass,
43
47
  gracefullyShutdown: () => gracefullyShutdown,
44
48
  handleCreateRoom: () => handleCreateRoom,
45
- hasHandler: () => hasHandler,
46
49
  healthCheckAllProcesses: () => healthCheckAllProcesses,
47
50
  healthCheckProcessId: () => healthCheckProcessId,
48
51
  join: () => join,
@@ -56,6 +59,7 @@ __export(MatchMaker_exports, {
56
59
  reconnect: () => reconnect,
57
60
  remoteRoomCall: () => remoteRoomCall,
58
61
  removeRoomType: () => removeRoomType,
62
+ reserveMultipleSeatsFor: () => reserveMultipleSeatsFor,
59
63
  reserveSeatFor: () => reserveSeatFor,
60
64
  selectProcessIdToCreateRoom: () => selectProcessIdToCreateRoom,
61
65
  setHealthChecksEnabled: () => setHealthChecksEnabled,
@@ -65,22 +69,22 @@ __export(MatchMaker_exports, {
65
69
  });
66
70
  module.exports = __toCommonJS(MatchMaker_exports);
67
71
  var import_events = require("events");
68
- var import_Protocol = require("./Protocol.js");
69
- var import_IPC = require("./IPC.js");
70
- var import_Utils = require("./utils/Utils.js");
71
- var import_DevMode = require("./utils/DevMode.js");
72
- var import_RegisteredHandler = require("./matchmaker/RegisteredHandler.js");
73
- var import_Room = require("./Room.js");
74
- var import_LocalPresence = require("./presence/LocalPresence.js");
75
- var import_Debug = require("./Debug.js");
76
- var import_SeatReservationError = require("./errors/SeatReservationError.js");
77
- var import_ServerError = require("./errors/ServerError.js");
78
- var import_LocalDriver = require("./matchmaker/driver/local/LocalDriver.js");
79
- var import_controller = __toESM(require("./matchmaker/controller.js"));
80
- var stats = __toESM(require("./Stats.js"));
81
- var import_Logger = require("./Logger.js");
82
- var import_discovery = require("./discovery/index.js");
83
- var import_api = require("./matchmaker/driver/api.js");
72
+ var import_Protocol = require("./Protocol.ts");
73
+ var import_IPC = require("./IPC.ts");
74
+ var import_Utils = require("./utils/Utils.ts");
75
+ var import_DevMode = require("./utils/DevMode.ts");
76
+ var import_RegisteredHandler = require("./matchmaker/RegisteredHandler.ts");
77
+ var import_Room = require("./Room.ts");
78
+ var import_LocalPresence = require("./presence/LocalPresence.ts");
79
+ var import_Presence = require("./presence/Presence.ts");
80
+ var import_Debug = require("./Debug.ts");
81
+ var import_SeatReservationError = require("./errors/SeatReservationError.ts");
82
+ var import_ServerError = require("./errors/ServerError.ts");
83
+ var import_LocalDriver = require("./matchmaker/LocalDriver/LocalDriver.ts");
84
+ var import_controller = __toESM(require("./matchmaker/controller.ts"), 1);
85
+ var stats = __toESM(require("./Stats.ts"), 1);
86
+ var import_Logger = require("./Logger.ts");
87
+ var import_driver = require("./matchmaker/driver.ts");
84
88
  const handlers = {};
85
89
  const rooms = {};
86
90
  const events = new import_events.EventEmitter();
@@ -88,37 +92,41 @@ let publicAddress;
88
92
  let processId;
89
93
  let presence;
90
94
  let driver;
91
- let selectProcessIdToCreateRoom;
95
+ let selectProcessIdToCreateRoom = async function() {
96
+ return (await stats.fetchAll()).sort((p1, p2) => p1.roomCount > p2.roomCount ? 1 : -1)[0]?.processId || processId;
97
+ };
92
98
  let enableHealthChecks = true;
93
99
  function setHealthChecksEnabled(value) {
94
100
  enableHealthChecks = value;
95
101
  }
96
102
  let onReady = new import_Utils.Deferred();
97
- var MatchMakerState = /* @__PURE__ */ ((MatchMakerState2) => {
98
- MatchMakerState2[MatchMakerState2["INITIALIZING"] = 0] = "INITIALIZING";
99
- MatchMakerState2[MatchMakerState2["READY"] = 1] = "READY";
100
- MatchMakerState2[MatchMakerState2["SHUTTING_DOWN"] = 2] = "SHUTTING_DOWN";
101
- return MatchMakerState2;
102
- })(MatchMakerState || {});
103
+ const MatchMakerState = {
104
+ INITIALIZING: 0,
105
+ READY: 1,
106
+ SHUTTING_DOWN: 2
107
+ };
103
108
  let state;
104
109
  async function setup(_presence, _driver, _publicAddress, _selectProcessIdToCreateRoom) {
105
110
  if (onReady === void 0) {
106
111
  onReady = new import_Utils.Deferred();
107
112
  }
108
- state = 0 /* INITIALIZING */;
113
+ state = MatchMakerState.INITIALIZING;
109
114
  presence = _presence || new import_LocalPresence.LocalPresence();
110
115
  driver = _driver || new import_LocalDriver.LocalDriver();
111
116
  publicAddress = _publicAddress;
112
117
  stats.reset(false);
113
118
  if (import_DevMode.isDevMode) {
114
- processId = await (0, import_DevMode.getPreviousProcessId)(await (0, import_discovery.getHostname)());
119
+ processId = await (0, import_DevMode.getPreviousProcessId)();
115
120
  }
116
121
  if (!processId) {
117
122
  processId = (0, import_Utils.generateId)();
118
123
  }
119
- selectProcessIdToCreateRoom = _selectProcessIdToCreateRoom || async function() {
120
- return (await stats.fetchAll()).sort((p1, p2) => p1.roomCount > p2.roomCount ? 1 : -1)[0]?.processId || processId;
121
- };
124
+ if (_selectProcessIdToCreateRoom) {
125
+ selectProcessIdToCreateRoom = _selectProcessIdToCreateRoom;
126
+ }
127
+ if (driver.boot) {
128
+ await driver.boot();
129
+ }
122
130
  onReady.resolve();
123
131
  }
124
132
  async function accept() {
@@ -134,7 +142,7 @@ async function accept() {
134
142
  await healthCheckAllProcesses();
135
143
  stats.setAutoPersistInterval();
136
144
  }
137
- state = 1 /* READY */;
145
+ state = MatchMakerState.READY;
138
146
  await stats.persist();
139
147
  if (import_DevMode.isDevMode) {
140
148
  await (0, import_DevMode.reloadFromCache)();
@@ -147,7 +155,7 @@ async function joinOrCreate(roomName, clientOptions = {}, authContext) {
147
155
  if (!room) {
148
156
  const handler = getHandler(roomName);
149
157
  const filterOptions = handler.getFilterOptions(clientOptions);
150
- const concurrencyKey = (0, import_api.getLockId)(filterOptions);
158
+ const concurrencyKey = (0, import_driver.getLockId)(filterOptions);
151
159
  await concurrentJoinOrCreateRoomLock(handler, concurrencyKey, async (roomId) => {
152
160
  if (roomId) {
153
161
  room = await driver.findOne({ roomId });
@@ -185,7 +193,7 @@ async function reconnect(roomId, clientOptions = {}) {
185
193
  if (!room) {
186
194
  if (process.env.NODE_ENV !== "production") {
187
195
  import_Logger.logger.info(`\u274C room "${roomId}" has been disposed. Did you miss .allowReconnection()?
188
- \u{1F449} https://docs.colyseus.io/server/room/#allowreconnection-client-seconds`);
196
+ \u{1F449} https://docs.colyseus.io/server/room#allow-reconnection`);
189
197
  }
190
198
  throw new import_ServerError.ServerError(import_Protocol.ErrorCode.MATCHMAKE_INVALID_ROOM_ID, `room "${roomId}" has been disposed.`);
191
199
  }
@@ -195,11 +203,11 @@ async function reconnect(roomId, clientOptions = {}) {
195
203
  }
196
204
  const sessionId = await remoteRoomCall(room.roomId, "checkReconnectionToken", [reconnectionToken]);
197
205
  if (sessionId) {
198
- return { room, sessionId };
206
+ return buildSeatReservation(room, sessionId);
199
207
  } else {
200
208
  if (process.env.NODE_ENV !== "production") {
201
209
  import_Logger.logger.info(`\u274C reconnection token invalid or expired. Did you miss .allowReconnection()?
202
- \u{1F449} https://docs.colyseus.io/server/room/#allowreconnection-client-seconds`);
210
+ \u{1F449} https://docs.colyseus.io/server/room#allow-reconnection`);
203
211
  }
204
212
  throw new import_ServerError.ServerError(import_Protocol.ErrorCode.MATCHMAKE_EXPIRED, `reconnection token invalid or expired.`);
205
213
  }
@@ -239,7 +247,7 @@ async function remoteRoomCall(roomId, method, args, rejectionTimeout = import_Ut
239
247
  if (method === "_reserveSeat" && e.message === "ipc_timeout") {
240
248
  throw e;
241
249
  }
242
- const request = `${method}${args && " with args " + JSON.stringify(args) || ""}`;
250
+ const request = `${String(method)}${args && " with args " + JSON.stringify(args) || ""}`;
243
251
  throw new import_ServerError.ServerError(
244
252
  import_Protocol.ErrorCode.MATCHMAKE_UNHANDLED,
245
253
  `remote room (${roomId}) timed out, requesting "${request}". (${rejectionTimeout}ms exceeded)`
@@ -250,7 +258,8 @@ async function remoteRoomCall(roomId, method, args, rejectionTimeout = import_Ut
250
258
  }
251
259
  }
252
260
  function defineRoomType(roomName, klass, defaultOptions) {
253
- const registeredHandler = new import_RegisteredHandler.RegisteredHandler(roomName, klass, defaultOptions);
261
+ const registeredHandler = new import_RegisteredHandler.RegisteredHandler(klass, defaultOptions);
262
+ registeredHandler.name = roomName;
254
263
  handlers[roomName] = registeredHandler;
255
264
  if (klass.prototype["onAuth"] !== import_Room.Room.prototype["onAuth"]) {
256
265
  if (klass["onAuth"] !== import_Room.Room["onAuth"]) {
@@ -259,12 +268,14 @@ function defineRoomType(roomName, klass, defaultOptions) {
259
268
  }
260
269
  return registeredHandler;
261
270
  }
271
+ function addRoomType(handler) {
272
+ handlers[handler.name] = handler;
273
+ }
262
274
  function removeRoomType(roomName) {
263
275
  delete handlers[roomName];
264
276
  }
265
- function hasHandler(roomName) {
266
- import_Logger.logger.warn("hasHandler() is deprecated. Use getHandler() instead.");
267
- return handlers[roomName] !== void 0;
277
+ function getAllHandlers() {
278
+ return handlers;
268
279
  }
269
280
  function getHandler(roomName) {
270
281
  const handler = handlers[roomName];
@@ -277,7 +288,7 @@ function getRoomClass(roomName) {
277
288
  return handlers[roomName]?.klass;
278
289
  }
279
290
  async function createRoom(roomName, clientOptions) {
280
- const selectedProcessId = state === 1 /* READY */ ? await selectProcessIdToCreateRoom(roomName, clientOptions) : processId;
291
+ const selectedProcessId = state === MatchMakerState.READY ? await selectProcessIdToCreateRoom(roomName, clientOptions) : processId;
281
292
  let room;
282
293
  if (selectedProcessId === void 0) {
283
294
  if (import_DevMode.isDevMode && processId === void 0) {
@@ -328,16 +339,15 @@ async function handleCreateRoom(roomName, clientOptions, restoringRoomId) {
328
339
  }
329
340
  room["__init"]();
330
341
  room.roomName = roomName;
331
- room.presence = presence;
332
- const additionalListingData = handler.getFilterOptions(clientOptions);
333
- if (publicAddress) {
334
- additionalListingData.publicAddress = publicAddress;
335
- }
336
- room.listing = driver.createInstance({
342
+ room.presence = (0, import_Presence.createScopedPresence)(room, presence);
343
+ room["_listing"] = (0, import_driver.initializeRoomCache)({
337
344
  name: roomName,
338
345
  processId,
339
- ...additionalListingData
346
+ ...handler.getMetadataFromOptions(clientOptions)
340
347
  });
348
+ if (publicAddress) {
349
+ room["_listing"].publicAddress = publicAddress;
350
+ }
341
351
  if (room.onCreate) {
342
352
  try {
343
353
  await room.onCreate((0, import_Utils.merge)({}, clientOptions, handler.options));
@@ -350,32 +360,38 @@ async function handleCreateRoom(roomName, clientOptions, restoringRoomId) {
350
360
  }
351
361
  }
352
362
  room["_internalState"] = import_Room.RoomInternalState.CREATED;
353
- room.listing.roomId = room.roomId;
354
- room.listing.maxClients = room.maxClients;
363
+ room["_listing"].roomId = room.roomId;
364
+ room["_listing"].maxClients = room.maxClients;
355
365
  (0, import_Debug.debugMatchMaking)("spawning '%s', roomId: %s, processId: %s", roomName, room.roomId, processId);
356
366
  stats.local.roomCount++;
357
367
  stats.persist();
358
- room._events.on("lock", lockRoom.bind(this, room));
359
- room._events.on("unlock", unlockRoom.bind(this, room));
360
- room._events.on("join", onClientJoinRoom.bind(this, room));
361
- room._events.on("leave", onClientLeaveRoom.bind(this, room));
362
- room._events.on("visibility-change", onVisibilityChange.bind(this, room));
363
- room._events.once("dispose", disposeRoom.bind(this, roomName, room));
364
- room._events.once("disconnect", () => {
365
- room._events.removeAllListeners("lock");
366
- room._events.removeAllListeners("unlock");
367
- room._events.removeAllListeners("visibility-change");
368
- room._events.removeAllListeners("dispose");
368
+ room["_events"].on("lock", lockRoom.bind(void 0, room));
369
+ room["_events"].on("unlock", unlockRoom.bind(void 0, room));
370
+ room["_events"].on("join", onClientJoinRoom.bind(void 0, room));
371
+ room["_events"].on("leave", onClientLeaveRoom.bind(void 0, room));
372
+ room["_events"].once("dispose", disposeRoom.bind(void 0, roomName, room));
373
+ if (handler.realtimeListingEnabled) {
374
+ room["_events"].on("visibility-change", onVisibilityChange.bind(void 0, room));
375
+ room["_events"].on("metadata-change", onMetadataChange.bind(void 0, room));
376
+ }
377
+ room["_events"].once("disconnect", () => {
378
+ room["_events"].removeAllListeners("lock");
379
+ room["_events"].removeAllListeners("unlock");
380
+ room["_events"].removeAllListeners("dispose");
381
+ if (handler.realtimeListingEnabled) {
382
+ room["_events"].removeAllListeners("visibility-change");
383
+ room["_events"].removeAllListeners("metadata-change");
384
+ }
369
385
  if (stats.local.roomCount <= 0) {
370
386
  events.emit("no-active-rooms");
371
387
  }
372
388
  });
373
389
  await createRoomReferences(room, true);
374
- if (state !== 2 /* SHUTTING_DOWN */) {
375
- await room.listing.save();
390
+ if (state !== MatchMakerState.SHUTTING_DOWN) {
391
+ await driver.persist(room["_listing"], true);
376
392
  }
377
393
  handler.emit("create", room);
378
- return room.listing;
394
+ return room["_listing"];
379
395
  }
380
396
  function getRoomById(roomId) {
381
397
  return driver.findOne({ roomId });
@@ -410,35 +426,33 @@ async function lockAndDisposeAll() {
410
426
  }
411
427
  const room = rooms[roomId];
412
428
  room.lock();
413
- room.onBeforeShutdown();
429
+ if (import_DevMode.isDevMode) {
430
+ import_Room.Room.prototype.onBeforeShutdown.call(room);
431
+ } else {
432
+ room.onBeforeShutdown();
433
+ }
414
434
  }
415
435
  await noActiveRooms;
416
436
  }
417
437
  async function gracefullyShutdown() {
418
- if (state === 2 /* SHUTTING_DOWN */) {
438
+ if (state === MatchMakerState.SHUTTING_DOWN) {
419
439
  return Promise.reject("already_shutting_down");
420
440
  }
421
441
  (0, import_Debug.debugMatchMaking)(`${processId} is shutting down!`);
422
- state = 2 /* SHUTTING_DOWN */;
442
+ state = MatchMakerState.SHUTTING_DOWN;
423
443
  onReady = void 0;
424
- await lockAndDisposeAll();
425
444
  if (import_DevMode.isDevMode) {
426
445
  await (0, import_DevMode.cacheRoomHistory)(rooms);
427
446
  }
447
+ await lockAndDisposeAll();
428
448
  await removeRoomsByProcessId(processId);
429
449
  presence.unsubscribe(getProcessChannel());
430
450
  return Promise.all(disconnectAll(
431
- import_DevMode.isDevMode ? import_Protocol.Protocol.WS_CLOSE_DEVMODE_RESTART : void 0
451
+ import_DevMode.isDevMode ? import_Protocol.CloseCode.DEVMODE_RESTART : import_Protocol.CloseCode.SERVER_SHUTDOWN
432
452
  ));
433
453
  }
434
454
  async function reserveSeatFor(room, options, authData) {
435
455
  const sessionId = authData?.sessionId || (0, import_Utils.generateId)();
436
- (0, import_Debug.debugMatchMaking)(
437
- "reserving seat. sessionId: '%s', roomId: '%s', processId: '%s'",
438
- sessionId,
439
- room.roomId,
440
- processId
441
- );
442
456
  let successfulSeatReservation;
443
457
  try {
444
458
  successfulSeatReservation = await remoteRoomCall(
@@ -458,11 +472,55 @@ async function reserveSeatFor(room, options, authData) {
458
472
  if (!successfulSeatReservation) {
459
473
  throw new import_SeatReservationError.SeatReservationError(`${room.roomId} is already full.`);
460
474
  }
461
- const response = { room, sessionId };
475
+ return buildSeatReservation(room, sessionId);
476
+ }
477
+ async function reserveMultipleSeatsFor(room, clientsData) {
478
+ let sessionIds = [];
479
+ let options = [];
480
+ let authData = [];
481
+ for (const clientData of clientsData) {
482
+ sessionIds.push(clientData.sessionId);
483
+ options.push(clientData.options);
484
+ authData.push(clientData.auth);
485
+ }
486
+ (0, import_Debug.debugMatchMaking)(
487
+ "reserving multiple seats. sessionIds: '%s', roomId: '%s', processId: '%s'",
488
+ sessionIds.join(", "),
489
+ room.roomId,
490
+ processId
491
+ );
492
+ let successfulSeatReservations;
493
+ try {
494
+ successfulSeatReservations = await remoteRoomCall(
495
+ room.roomId,
496
+ "_reserveMultipleSeats",
497
+ [sessionIds, options, authData],
498
+ import_Utils.REMOTE_ROOM_SHORT_TIMEOUT
499
+ );
500
+ } catch (e) {
501
+ (0, import_Debug.debugMatchMaking)(e);
502
+ if (e.message === "ipc_timeout" && !(enableHealthChecks && await healthCheckProcessId(room.processId))) {
503
+ throw new import_SeatReservationError.SeatReservationError(`process ${room.processId} is not available.`);
504
+ } else {
505
+ throw new import_SeatReservationError.SeatReservationError(`${room.roomId} is already full.`);
506
+ }
507
+ }
508
+ return successfulSeatReservations;
509
+ }
510
+ function buildSeatReservation(room, sessionId) {
511
+ const seatReservation = {
512
+ name: room.name,
513
+ sessionId,
514
+ roomId: room.roomId,
515
+ processId: room.processId
516
+ };
462
517
  if (import_DevMode.isDevMode) {
463
- response.devMode = import_DevMode.isDevMode;
518
+ seatReservation.devMode = import_DevMode.isDevMode;
464
519
  }
465
- return response;
520
+ if (room.publicAddress) {
521
+ seatReservation.publicAddress = room.publicAddress;
522
+ }
523
+ return seatReservation;
466
524
  }
467
525
  async function callOnAuth(roomName, clientOptions, authContext) {
468
526
  const roomClass = getRoomClass(roomName);
@@ -476,7 +534,7 @@ async function callOnAuth(roomName, clientOptions, authContext) {
476
534
  }
477
535
  async function healthCheckAllProcesses() {
478
536
  const allStats = await stats.fetchAll();
479
- const activeProcessChannels = typeof presence.channels === "function" ? (await presence.channels("p:*")).map((c) => c.substring(2)) : [];
537
+ const activeProcessChannels = (await presence.channels("p:*")).map((c) => c.substring(2));
480
538
  if (allStats.length > 0) {
481
539
  await Promise.all(
482
540
  allStats.filter((stat) => stat.processId !== processId && // skip current process
@@ -504,8 +562,8 @@ function healthCheckProcessId(processId2) {
504
562
  resolve(true);
505
563
  } catch (e) {
506
564
  import_Logger.logger.debug(`\u274C Process '${processId2}' failed to respond. Cleaning it up.`);
507
- const isProcessExcluded = await stats.excludeProcess(processId2);
508
- if (isProcessExcluded && !import_DevMode.isDevMode) {
565
+ await stats.excludeProcess(processId2);
566
+ if (!import_DevMode.isDevMode) {
509
567
  await removeRoomsByProcessId(processId2);
510
568
  }
511
569
  resolve(false);
@@ -593,11 +651,14 @@ async function unlockRoom(room) {
593
651
  function onVisibilityChange(room, isInvisible) {
594
652
  handlers[room.roomName].emit("visibility-change", room, isInvisible);
595
653
  }
654
+ function onMetadataChange(room) {
655
+ handlers[room.roomName].emit("metadata-change", room);
656
+ }
596
657
  async function disposeRoom(roomName, room) {
597
- (0, import_Debug.debugMatchMaking)("disposing '%s' (%s) on processId '%s' (graceful shutdown: %s)", roomName, room.roomId, processId, state === 2 /* SHUTTING_DOWN */);
598
- room.listing.remove();
658
+ (0, import_Debug.debugMatchMaking)("disposing '%s' (%s) on processId '%s' (graceful shutdown: %s)", roomName, room.roomId, processId, state === MatchMakerState.SHUTTING_DOWN);
659
+ driver.remove(room["_listing"].roomId);
599
660
  stats.local.roomCount--;
600
- if (state !== 2 /* SHUTTING_DOWN */) {
661
+ if (state !== MatchMakerState.SHUTTING_DOWN) {
601
662
  stats.persist();
602
663
  if (import_DevMode.isDevMode) {
603
664
  await presence.hdel((0, import_DevMode.getRoomRestoreListKey)(), room.roomId);
@@ -620,6 +681,8 @@ function getProcessChannel(id = processId) {
620
681
  0 && (module.exports = {
621
682
  MatchMakerState,
622
683
  accept,
684
+ addRoomType,
685
+ buildSeatReservation,
623
686
  controller,
624
687
  create,
625
688
  createRoom,
@@ -627,13 +690,13 @@ function getProcessChannel(id = processId) {
627
690
  disconnectAll,
628
691
  driver,
629
692
  findOneRoomAvailable,
693
+ getAllHandlers,
630
694
  getHandler,
631
695
  getLocalRoomById,
632
696
  getRoomById,
633
697
  getRoomClass,
634
698
  gracefullyShutdown,
635
699
  handleCreateRoom,
636
- hasHandler,
637
700
  healthCheckAllProcesses,
638
701
  healthCheckProcessId,
639
702
  join,
@@ -647,6 +710,7 @@ function getProcessChannel(id = processId) {
647
710
  reconnect,
648
711
  remoteRoomCall,
649
712
  removeRoomType,
713
+ reserveMultipleSeatsFor,
650
714
  reserveSeatFor,
651
715
  selectProcessIdToCreateRoom,
652
716
  setHealthChecksEnabled,