@colyseus/core 0.16.0-preview.27 → 0.16.0-preview.29

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 (73) hide show
  1. package/build/Debug.js +4 -0
  2. package/build/Debug.js.map +1 -1
  3. package/build/IPC.js.map +1 -1
  4. package/build/IPC.mjs.map +1 -1
  5. package/build/MatchMaker.js +7 -0
  6. package/build/MatchMaker.js.map +1 -1
  7. package/build/MatchMaker.mjs +3 -0
  8. package/build/MatchMaker.mjs.map +1 -1
  9. package/build/Protocol.js.map +1 -1
  10. package/build/Protocol.mjs.map +1 -1
  11. package/build/Room.js +123 -2
  12. package/build/Room.js.map +1 -1
  13. package/build/Room.mjs +119 -2
  14. package/build/Room.mjs.map +1 -1
  15. package/build/Server.js +28 -0
  16. package/build/Server.js.map +2 -2
  17. package/build/Server.mjs +24 -0
  18. package/build/Server.mjs.map +2 -2
  19. package/build/Stats.js.map +1 -1
  20. package/build/Stats.mjs.map +1 -1
  21. package/build/Transport.d.ts +1 -0
  22. package/build/Transport.js.map +2 -2
  23. package/build/Transport.mjs.map +2 -2
  24. package/build/discovery/index.js.map +1 -1
  25. package/build/discovery/index.mjs.map +1 -1
  26. package/build/index.js +6 -3
  27. package/build/index.js.map +1 -1
  28. package/build/index.mjs +0 -2
  29. package/build/index.mjs.map +1 -1
  30. package/build/matchmaker/Lobby.js +5 -2
  31. package/build/matchmaker/Lobby.js.map +1 -1
  32. package/build/matchmaker/Lobby.mjs +1 -2
  33. package/build/matchmaker/Lobby.mjs.map +1 -1
  34. package/build/matchmaker/RegisteredHandler.js +1 -0
  35. package/build/matchmaker/RegisteredHandler.js.map +1 -1
  36. package/build/matchmaker/RegisteredHandler.mjs +1 -0
  37. package/build/matchmaker/RegisteredHandler.mjs.map +1 -1
  38. package/build/matchmaker/controller.js +19 -2
  39. package/build/matchmaker/controller.js.map +1 -1
  40. package/build/matchmaker/controller.mjs +15 -0
  41. package/build/matchmaker/controller.mjs.map +1 -1
  42. package/build/matchmaker/driver/api.js.map +1 -1
  43. package/build/matchmaker/driver/api.mjs.map +1 -1
  44. package/build/matchmaker/driver/local/LocalDriver.js.map +1 -1
  45. package/build/matchmaker/driver/local/LocalDriver.mjs.map +1 -1
  46. package/build/matchmaker/driver/local/Query.js.map +1 -1
  47. package/build/matchmaker/driver/local/Query.mjs.map +1 -1
  48. package/build/matchmaker/driver/local/RoomData.js +1 -1
  49. package/build/matchmaker/driver/local/RoomData.js.map +1 -1
  50. package/build/matchmaker/driver/local/RoomData.mjs +1 -1
  51. package/build/matchmaker/driver/local/RoomData.mjs.map +1 -1
  52. package/build/presence/LocalPresence.js +4 -0
  53. package/build/presence/LocalPresence.js.map +1 -1
  54. package/build/presence/LocalPresence.mjs.map +1 -1
  55. package/build/rooms/LobbyRoom.js +5 -0
  56. package/build/rooms/LobbyRoom.js.map +1 -1
  57. package/build/rooms/LobbyRoom.mjs +1 -0
  58. package/build/rooms/LobbyRoom.mjs.map +1 -1
  59. package/build/rooms/RelayRoom.js +2 -0
  60. package/build/rooms/RelayRoom.js.map +1 -1
  61. package/build/rooms/RelayRoom.mjs +2 -0
  62. package/build/rooms/RelayRoom.mjs.map +1 -1
  63. package/build/serializer/SchemaSerializer.js +2 -0
  64. package/build/serializer/SchemaSerializer.js.map +1 -1
  65. package/build/serializer/SchemaSerializer.mjs +2 -0
  66. package/build/serializer/SchemaSerializer.mjs.map +1 -1
  67. package/build/utils/DevMode.js +4 -0
  68. package/build/utils/DevMode.js.map +1 -1
  69. package/build/utils/DevMode.mjs.map +1 -1
  70. package/build/utils/Utils.js +4 -0
  71. package/build/utils/Utils.js.map +1 -1
  72. package/build/utils/Utils.mjs.map +1 -1
  73. package/package.json +2 -2
package/build/Room.js CHANGED
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
17
17
  return to;
18
18
  };
19
19
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
20
24
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
25
  mod
22
26
  ));
@@ -53,12 +57,38 @@ var RoomInternalState = /* @__PURE__ */ ((RoomInternalState2) => {
53
57
  })(RoomInternalState || {});
54
58
  class Room {
55
59
  constructor() {
60
+ /**
61
+ * Timing events tied to the room instance.
62
+ * Intervals and timeouts are cleared when the room is disposed.
63
+ */
56
64
  this.clock = new import_timer.default();
65
+ /**
66
+ * Maximum number of clients allowed to connect into the room. When room reaches this limit,
67
+ * it is locked automatically. Unless the room was explicitly locked by you via `lock()` method,
68
+ * the room will be unlocked as soon as a client disconnects from it.
69
+ */
57
70
  this.maxClients = Infinity;
71
+ /**
72
+ * Automatically dispose the room when last client disconnects.
73
+ *
74
+ * @default true
75
+ */
58
76
  this.autoDispose = true;
77
+ /**
78
+ * Frequency to send the room state to connected clients, in milliseconds.
79
+ *
80
+ * @default 50ms (20fps)
81
+ */
59
82
  this.patchRate = DEFAULT_PATCH_RATE;
83
+ /**
84
+ * The array of connected clients.
85
+ *
86
+ * @see {@link https://docs.colyseus.io/colyseus/server/room/#client|Client instance}
87
+ */
60
88
  this.clients = new import_Transport.ClientArray();
89
+ /** @internal */
61
90
  this._events = new import_events.EventEmitter();
91
+ // seat reservation & reconnection
62
92
  this.seatReservationTime = DEFAULT_SEAT_RESERVATION_TIME;
63
93
  this.reservedSeats = {};
64
94
  this.reservedSeatTimeouts = {};
@@ -87,6 +117,13 @@ class Room {
87
117
  this._dispose().catch((e) => (0, import_Debug.debugAndPrintError)(`onDispose error: ${e && e.message || e || "promise rejected"}`)).finally(() => this._events.emit("disconnect"));
88
118
  });
89
119
  }
120
+ /**
121
+ * This property will change on these situations:
122
+ * - The maximum number of allowed clients has been reached (`maxClients`)
123
+ * - You manually locked, or unlocked the room using lock() or `unlock()`.
124
+ *
125
+ * @readonly
126
+ */
90
127
  get locked() {
91
128
  return this._locked;
92
129
  }
@@ -133,33 +170,77 @@ class Room {
133
170
  this.patchRate = this.#_patchRate;
134
171
  this.resetAutoDisposeTimeout(this.seatReservationTime);
135
172
  }
173
+ /**
174
+ * The name of the room you provided as first argument for `gameServer.define()`.
175
+ *
176
+ * @returns roomName string
177
+ */
136
178
  get roomName() {
137
179
  return this.#_roomName;
138
180
  }
181
+ /**
182
+ * Setting the name of the room. Overwriting this property is restricted.
183
+ *
184
+ * @param roomName
185
+ */
139
186
  set roomName(roomName) {
140
187
  if (this.#_roomName) {
141
188
  throw new import_ServerError.ServerError(import_Protocol.ErrorCode.APPLICATION_ERROR, "'roomName' cannot be overwritten.");
142
189
  }
143
190
  this.#_roomName = roomName;
144
191
  }
192
+ /**
193
+ * A unique, auto-generated, 9-character-long id of the room.
194
+ * You may replace `this.roomId` during `onCreate()`.
195
+ *
196
+ * @returns roomId string
197
+ */
145
198
  get roomId() {
146
199
  return this.#_roomId;
147
200
  }
201
+ /**
202
+ * Setting the roomId, is restricted in room lifetime except upon room creation.
203
+ *
204
+ * @param roomId
205
+ * @returns roomId string
206
+ */
148
207
  set roomId(roomId) {
149
208
  if (this._internalState !== 0 /* CREATING */ && !import_DevMode.isDevMode) {
150
209
  throw new import_ServerError.ServerError(import_Protocol.ErrorCode.APPLICATION_ERROR, "'roomId' can only be overridden upon room creation.");
151
210
  }
152
211
  this.#_roomId = roomId;
153
212
  }
213
+ // TODO: flag as @deprecated on v0.16
214
+ // TOOD: remove instance level `onAuth` on 1.0
215
+ /**
216
+ * onAuth at the instance level will be deprecated in the future.
217
+ * Please use "static onAuth(token, req) instead
218
+ */
154
219
  onAuth(client, options, request) {
155
220
  return true;
156
221
  }
157
222
  static async onAuth(token, req) {
158
223
  return true;
159
224
  }
225
+ /**
226
+ * Returns whether the sum of connected clients and reserved seats exceeds maximum number of clients.
227
+ *
228
+ * @returns boolean
229
+ */
160
230
  hasReachedMaxClients() {
161
231
  return this.clients.length + Object.keys(this.reservedSeats).length >= this.maxClients || this._internalState === 2 /* DISPOSING */;
162
232
  }
233
+ /**
234
+ * Set the number of seconds a room can wait for a client to effectively join the room.
235
+ * You should consider how long your `onAuth()` will have to wait for setting a different seat reservation time.
236
+ * The default value is 15 seconds. You may set the `COLYSEUS_SEAT_RESERVATION_TIME`
237
+ * environment variable if you'd like to change the seat reservation time globally.
238
+ *
239
+ * @default 15 seconds
240
+ *
241
+ * @param seconds - number of seconds.
242
+ * @returns The modified Room object.
243
+ */
163
244
  setSeatReservationTime(seconds) {
164
245
  this.seatReservationTime = seconds;
165
246
  return this;
@@ -185,6 +266,16 @@ class Room {
185
266
  return void 0;
186
267
  }
187
268
  }
269
+ /**
270
+ * (Optional) Set a simulation interval that can change the state of the game.
271
+ * The simulation interval is your game loop.
272
+ *
273
+ * @default 16.6ms (60fps)
274
+ *
275
+ * @param onTickCallback - You can implement your physics or world updates here!
276
+ * This is a good place to update the room state.
277
+ * @param delay - Interval delay on executing `onTickCallback` in milliseconds.
278
+ */
188
279
  setSimulationInterval(onTickCallback, delay = DEFAULT_SIMULATION_INTERVAL) {
189
280
  if (this._simulationInterval) {
190
281
  clearInterval(this._simulationInterval);
@@ -196,6 +287,9 @@ class Room {
196
287
  }, delay);
197
288
  }
198
289
  }
290
+ /**
291
+ * @deprecated Use `.patchRate=` instead.
292
+ */
199
293
  setPatchRate(milliseconds) {
200
294
  this.patchRate = milliseconds;
201
295
  }
@@ -231,14 +325,16 @@ class Room {
231
325
  }
232
326
  }
233
327
  async setPrivate(bool = true) {
234
- if (this.listing.private === bool)
235
- return;
328
+ if (this.listing.private === bool) return;
236
329
  this.listing.private = bool;
237
330
  if (this._internalState === 1 /* CREATED */) {
238
331
  await this.listing.save();
239
332
  }
240
333
  this._events.emit("visibility-change", bool);
241
334
  }
335
+ /**
336
+ * Locking the room will remove it from the pool of available rooms for new clients to connect to.
337
+ */
242
338
  async lock() {
243
339
  this._lockedExplicitly = arguments[0] === void 0;
244
340
  if (this._locked) {
@@ -250,6 +346,9 @@ class Room {
250
346
  });
251
347
  this._events.emit("lock");
252
348
  }
349
+ /**
350
+ * Unlocking the room returns it to the pool of available rooms for new clients to connect to.
351
+ */
253
352
  async unlock() {
254
353
  if (arguments[0] === void 0) {
255
354
  this._lockedExplicitly = false;
@@ -275,6 +374,9 @@ class Room {
275
374
  }
276
375
  this.broadcastMessageType(type, message, options);
277
376
  }
377
+ /**
378
+ * Broadcast bytes (UInt8Arrays) to a particular room
379
+ */
278
380
  broadcastBytes(type, message, options) {
279
381
  if (options && options.afterNextPatch) {
280
382
  delete options.afterNextPatch;
@@ -283,6 +385,9 @@ class Room {
283
385
  }
284
386
  this.broadcastMessageType(type, message, options);
285
387
  }
388
+ /**
389
+ * Checks whether mutations have occurred in the state, and broadcast them to all connected clients.
390
+ */
286
391
  broadcastPatch() {
287
392
  if (this.onBeforePatch) {
288
393
  this.onBeforePatch(this.state);
@@ -301,6 +406,12 @@ class Room {
301
406
  this.onMessageHandlers[messageType] = { callback, validate };
302
407
  return () => delete this.onMessageHandlers[messageType];
303
408
  }
409
+ /**
410
+ * Disconnect all connected clients, and then dispose the room.
411
+ *
412
+ * @param closeCode WebSocket close code (default = 4000, which is a "consented leave")
413
+ * @returns Promise<void>
414
+ */
304
415
  disconnect(closeCode = import_Protocol.Protocol.WS_CLOSE_CONSENTED) {
305
416
  if (this._internalState === 2 /* DISPOSING */) {
306
417
  return Promise.resolve(`disconnect() ignored: room (${this.roomId}) is already disposing.`);
@@ -400,6 +511,16 @@ class Room {
400
511
  ));
401
512
  }
402
513
  }
514
+ /**
515
+ * Allow the specified client to reconnect into the room. Must be used inside `onLeave()` method.
516
+ * If seconds is provided, the reconnection is going to be cancelled after the provided amount of seconds.
517
+ *
518
+ * @param previousClient - The client which is to be waiting until re-connection happens.
519
+ * @param seconds - Timeout period on re-connection in seconds.
520
+ *
521
+ * @returns Deferred<Client> - The differed is a promise like type.
522
+ * This type can forcibly reject the promise by calling `.reject()`.
523
+ */
403
524
  allowReconnection(previousClient, seconds) {
404
525
  if (previousClient._enqueuedMessages !== void 0) {
405
526
  return import_Utils.Deferred.reject("client not joined");
package/build/Room.js.map CHANGED
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/Room.ts"],
4
4
  "sourcesContent": ["import http, { IncomingMessage } from 'http';\n\nimport { unpack } from '@colyseus/msgpackr';\nimport { decode, Iterator, $changes } from '@colyseus/schema';\n\nimport Clock from '@gamestdio/timer';\nimport { EventEmitter } from 'events';\nimport { logger } from './Logger';\n\nimport { Presence } from './presence/Presence';\n\nimport { NoneSerializer } from './serializer/NoneSerializer';\nimport { SchemaSerializer } from './serializer/SchemaSerializer';\nimport { Serializer } from './serializer/Serializer';\n\nimport { ErrorCode, getMessageBytes, Protocol } from './Protocol';\nimport { Deferred, generateId } from './utils/Utils';\nimport { isDevMode } from './utils/DevMode';\n\nimport { debugAndPrintError, debugMessage } from './Debug';\nimport { ServerError } from './errors/ServerError';\nimport { RoomCache } from './matchmaker/driver/local/LocalDriver';\nimport { Client, ClientArray, ClientPrivate, ClientState, ISendOptions } from './Transport';\n\nconst DEFAULT_PATCH_RATE = 1000 / 20; // 20fps (50ms)\nconst DEFAULT_SIMULATION_INTERVAL = 1000 / 60; // 60fps (16.66ms)\nconst noneSerializer = new NoneSerializer();\n\nexport const DEFAULT_SEAT_RESERVATION_TIME = Number(process.env.COLYSEUS_SEAT_RESERVATION_TIME || 15);\n\nexport type SimulationCallback = (deltaTime: number) => void;\n\nexport interface IBroadcastOptions extends ISendOptions {\n except?: Client | Client[];\n}\n\nexport enum RoomInternalState {\n CREATING = 0,\n CREATED = 1,\n DISPOSING = 2,\n}\n\n/**\n * A Room class is meant to implement a game session, and/or serve as the communication channel\n * between a group of clients.\n *\n * - Rooms are created on demand during matchmaking by default\n * - Room classes must be exposed using `.define()`\n */\nexport abstract class Room<State extends object= any, Metadata= any, UserData = any, AuthData = any> {\n\n /**\n * This property will change on these situations:\n * - The maximum number of allowed clients has been reached (`maxClients`)\n * - You manually locked, or unlocked the room using lock() or `unlock()`.\n *\n * @readonly\n */\n public get locked() {\n return this._locked;\n }\n\n public get metadata() {\n return this.listing.metadata;\n }\n\n public listing: RoomCache<Metadata>;\n\n /**\n * Timing events tied to the room instance.\n * Intervals and timeouts are cleared when the room is disposed.\n */\n public clock: Clock = new Clock();\n\n #_roomId: string;\n #_roomName: string;\n\n /**\n * Maximum number of clients allowed to connect into the room. When room reaches this limit,\n * it is locked automatically. Unless the room was explicitly locked by you via `lock()` method,\n * the room will be unlocked as soon as a client disconnects from it.\n */\n public maxClients: number = Infinity;\n\n /**\n * Automatically dispose the room when last client disconnects.\n *\n * @default true\n */\n public autoDispose: boolean = true;\n #_autoDispose: boolean;\n\n /**\n * Frequency to send the room state to connected clients, in milliseconds.\n *\n * @default 50ms (20fps)\n */\n public patchRate: number = DEFAULT_PATCH_RATE;\n #_patchRate: number;\n #_patchInterval: NodeJS.Timeout;\n\n /**\n * The state instance you provided to `setState()`.\n */\n public state: State;\n\n /**\n * The presence instance. Check Presence API for more details.\n *\n * @see {@link https://docs.colyseus.io/colyseus/server/presence/|Presence API}\n */\n public presence: Presence;\n\n /**\n * The array of connected clients.\n *\n * @see {@link https://docs.colyseus.io/colyseus/server/room/#client|Client instance}\n */\n public clients: ClientArray<UserData, AuthData> = new ClientArray();\n\n /** @internal */\n public _events = new EventEmitter();\n\n // seat reservation & reconnection\n protected seatReservationTime: number = DEFAULT_SEAT_RESERVATION_TIME;\n protected reservedSeats: { [sessionId: string]: [any, any, boolean?, boolean?] } = {};\n protected reservedSeatTimeouts: { [sessionId: string]: NodeJS.Timeout } = {};\n\n protected _reconnections: { [reconnectionToken: string]: [string, Deferred] } = {};\n private _reconnectingSessionId = new Map<string, string>();\n\n private onMessageHandlers: {\n [id: string]: {\n callback: (...args: any[]) => void,\n validate?: (data: unknown) => any,\n }\n } = {\n '__no_message_handler': {\n callback: (client: Client, messageType: string, _: unknown) => {\n const errorMessage = `onMessage for \"${messageType}\" not registered.`;\n debugAndPrintError(errorMessage);\n\n if (isDevMode) {\n // send error code to client in development mode\n client.error(ErrorCode.INVALID_PAYLOAD, errorMessage);\n\n } else {\n // immediately close the connection in production\n client.leave(Protocol.WS_CLOSE_WITH_ERROR, errorMessage);\n }\n }\n }\n };\n\n private _serializer: Serializer<State> = noneSerializer;\n private _afterNextPatchQueue: Array<[string | Client, IArguments]> = [];\n\n private _simulationInterval: NodeJS.Timeout;\n\n private _internalState: RoomInternalState = RoomInternalState.CREATING;\n private _locked: boolean = false;\n private _lockedExplicitly: boolean = false;\n private _maxClientsReached: boolean = false;\n\n // this timeout prevents rooms that are created by one process, but no client\n // ever had success joining into it on the specified interval.\n private _autoDisposeTimeout: NodeJS.Timeout;\n\n constructor() {\n this._events.once('dispose', () => {\n this._dispose()\n .catch((e) => debugAndPrintError(`onDispose error: ${(e && e.message || e || 'promise rejected')}`))\n .finally(() => this._events.emit('disconnect'));\n });\n }\n\n protected __init() {\n if (this.state) {\n this.setState(this.state);\n }\n\n this.#_autoDispose = this.autoDispose;\n this.#_patchRate = this.patchRate;\n\n Object.defineProperties(this, {\n autoDispose: {\n enumerable: true,\n get: () => this.#_autoDispose,\n set: (value: boolean) => {\n if (\n value !== this.#_autoDispose &&\n this._internalState !== RoomInternalState.DISPOSING\n ) {\n this.#_autoDispose = value;\n this.resetAutoDisposeTimeout();\n }\n },\n },\n\n patchRate: {\n enumerable: true,\n get: () => this.#_patchRate,\n set: (milliseconds: number) => {\n this.#_patchRate = milliseconds;\n // clear previous interval in case called setPatchRate more than once\n if (this.#_patchInterval) {\n clearInterval(this.#_patchInterval);\n this.#_patchInterval = undefined;\n }\n if (milliseconds !== null && milliseconds !== 0) {\n this.#_patchInterval = setInterval(() => this.broadcastPatch(), milliseconds);\n }\n },\n },\n });\n\n // set patch interval, now with the setter\n this.patchRate = this.#_patchRate;\n\n // set default _autoDisposeTimeout\n this.resetAutoDisposeTimeout(this.seatReservationTime);\n }\n\n /**\n * The name of the room you provided as first argument for `gameServer.define()`.\n *\n * @returns roomName string\n */\n public get roomName() { return this.#_roomName; }\n /**\n * Setting the name of the room. Overwriting this property is restricted.\n *\n * @param roomName\n */\n public set roomName(roomName: string) {\n if (this.#_roomName) {\n // prevent user from setting roomName after it has been defined.\n throw new ServerError(ErrorCode.APPLICATION_ERROR, \"'roomName' cannot be overwritten.\");\n }\n this.#_roomName = roomName;\n }\n\n /**\n * A unique, auto-generated, 9-character-long id of the room.\n * You may replace `this.roomId` during `onCreate()`.\n *\n * @returns roomId string\n */\n public get roomId() { return this.#_roomId; }\n\n /**\n * Setting the roomId, is restricted in room lifetime except upon room creation.\n *\n * @param roomId\n * @returns roomId string\n */\n public set roomId(roomId: string) {\n if (this._internalState !== RoomInternalState.CREATING && !isDevMode) {\n // prevent user from setting roomId after room has been created.\n throw new ServerError(ErrorCode.APPLICATION_ERROR, \"'roomId' can only be overridden upon room creation.\");\n }\n this.#_roomId = roomId;\n }\n\n // Optional abstract methods\n public onBeforePatch?(state: State): void | Promise<any>;\n public onCreate?(options: any): void | Promise<any>;\n public onJoin?(client: Client<UserData, AuthData>, options?: any, auth?: AuthData): void | Promise<any>;\n public onLeave?(client: Client<UserData, AuthData>, consented?: boolean): void | Promise<any>;\n public onDispose?(): void | Promise<any>;\n\n // TODO: flag as @deprecated on v0.16\n // TOOD: remove instance level `onAuth` on 1.0\n /**\n * onAuth at the instance level will be deprecated in the future.\n * Please use \"static onAuth(token, req) instead\n */\n public onAuth(client: Client<UserData, AuthData>, options: any, request?: http.IncomingMessage): any | Promise<any> {\n return true;\n }\n\n static async onAuth(token: string, req: IncomingMessage): Promise<unknown> {\n return true;\n }\n\n /**\n * devMode: When `devMode` is enabled, `onCacheRoom` method is called during\n * graceful shutdown.\n *\n * Implement this method to return custom data to be cached. `onRestoreRoom`\n * will be called with the data returned by `onCacheRoom`\n */\n public onCacheRoom?(): any;\n\n /**\n * devMode: When `devMode` is enabled, `onRestoreRoom` method is called during\n * process startup, with the data returned by the `onCacheRoom` method.\n */\n public onRestoreRoom?(cached?: any): void;\n\n /**\n * Returns whether the sum of connected clients and reserved seats exceeds maximum number of clients.\n *\n * @returns boolean\n */\n public hasReachedMaxClients(): boolean {\n return (\n (this.clients.length + Object.keys(this.reservedSeats).length) >= this.maxClients ||\n this._internalState === RoomInternalState.DISPOSING\n );\n }\n\n /**\n * Set the number of seconds a room can wait for a client to effectively join the room.\n * You should consider how long your `onAuth()` will have to wait for setting a different seat reservation time.\n * The default value is 15 seconds. You may set the `COLYSEUS_SEAT_RESERVATION_TIME`\n * environment variable if you'd like to change the seat reservation time globally.\n *\n * @default 15 seconds\n *\n * @param seconds - number of seconds.\n * @returns The modified Room object.\n */\n public setSeatReservationTime(seconds: number) {\n this.seatReservationTime = seconds;\n return this;\n }\n\n public hasReservedSeat(sessionId: string, reconnectionToken?: string): boolean {\n const reservedSeat = this.reservedSeats[sessionId];\n\n // seat reservation not found / expired\n if (reservedSeat === undefined) {\n return false;\n }\n\n if (reservedSeat[3]) {\n // reconnection\n return (\n reconnectionToken &&\n this._reconnections[reconnectionToken]?.[0] === sessionId &&\n this._reconnectingSessionId.has(sessionId)\n );\n\n } else {\n // seat reservation not consumed\n return reservedSeat[2] === false;\n }\n }\n\n public checkReconnectionToken(reconnectionToken: string) {\n const sessionId = this._reconnections[reconnectionToken]?.[0];\n const reservedSeat = this.reservedSeats[sessionId];\n\n if (reservedSeat && reservedSeat[3]) {\n this._reconnectingSessionId.set(sessionId, reconnectionToken);\n return sessionId;\n\n } else {\n return undefined;\n }\n }\n\n /**\n * (Optional) Set a simulation interval that can change the state of the game.\n * The simulation interval is your game loop.\n *\n * @default 16.6ms (60fps)\n *\n * @param onTickCallback - You can implement your physics or world updates here!\n * This is a good place to update the room state.\n * @param delay - Interval delay on executing `onTickCallback` in milliseconds.\n */\n public setSimulationInterval(onTickCallback?: SimulationCallback, delay: number = DEFAULT_SIMULATION_INTERVAL): void {\n // clear previous interval in case called setSimulationInterval more than once\n if (this._simulationInterval) { clearInterval(this._simulationInterval); }\n\n if (onTickCallback) {\n this._simulationInterval = setInterval(() => {\n this.clock.tick();\n onTickCallback(this.clock.deltaTime);\n }, delay);\n }\n }\n\n /**\n * @deprecated Use `.patchRate=` instead.\n */\n public setPatchRate(milliseconds: number | null): void {\n this.patchRate = milliseconds;\n }\n\n public setState(newState: State) {\n this.clock.start();\n\n if (newState[$changes] !== undefined) {\n this.setSerializer(new SchemaSerializer());\n\n } else if ($changes === undefined) {\n throw new Error(\"@colyseus/schema v2 compatibility currently missing (reach out if you need it)\");\n }\n\n this._serializer.reset(newState);\n\n this.state = newState;\n }\n\n public setSerializer(serializer: Serializer<State>) {\n this._serializer = serializer;\n }\n\n public async setMetadata(meta: Partial<Metadata>) {\n if (!this.listing.metadata) {\n this.listing.metadata = meta as Metadata;\n\n } else {\n for (const field in meta) {\n if (!meta.hasOwnProperty(field)) { continue; }\n this.listing.metadata[field] = meta[field];\n }\n\n // `MongooseDriver` workaround: persit metadata mutations\n if ('markModified' in this.listing) {\n (this.listing as any).markModified('metadata');\n }\n }\n\n if (this._internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async setPrivate(bool: boolean = true) {\n if (this.listing.private === bool) return;\n\n this.listing.private = bool;\n\n if (this._internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n\n this._events.emit('visibility-change', bool);\n }\n\n /**\n * Locking the room will remove it from the pool of available rooms for new clients to connect to.\n */\n public async lock() {\n // rooms locked internally aren't explicit locks.\n this._lockedExplicitly = (arguments[0] === undefined);\n\n // skip if already locked.\n if (this._locked) { return; }\n\n this._locked = true;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('lock');\n }\n\n /**\n * Unlocking the room returns it to the pool of available rooms for new clients to connect to.\n */\n public async unlock() {\n // only internal usage passes arguments to this function.\n if (arguments[0] === undefined) {\n this._lockedExplicitly = false;\n }\n\n // skip if already locked\n if (!this._locked) { return; }\n\n this._locked = false;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('unlock');\n }\n\n public send(client: Client, type: string | number, message: any, options?: ISendOptions): void;\n public send(client: Client, messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions): void {\n logger.warn('DEPRECATION WARNING: use client.send(...) instead of this.send(client, ...)');\n client.send(messageOrType, messageOrOptions, options);\n }\n\n public broadcast(type: string | number, message?: any, options?: IBroadcastOptions) {\n if (options && options.afterNextPatch) {\n delete options.afterNextPatch;\n this._afterNextPatchQueue.push(['broadcast', arguments]);\n return;\n }\n\n this.broadcastMessageType(type, message, options);\n }\n\n /**\n * Broadcast bytes (UInt8Arrays) to a particular room\n */\n public broadcastBytes(type: string | number, message: Uint8Array, options: IBroadcastOptions) {\n if (options && options.afterNextPatch) {\n delete options.afterNextPatch;\n this._afterNextPatchQueue.push(['broadcastBytes', arguments]);\n return;\n }\n\n this.broadcastMessageType(type as string, message, options);\n }\n\n /**\n * Checks whether mutations have occurred in the state, and broadcast them to all connected clients.\n */\n public broadcastPatch() {\n if (this.onBeforePatch) {\n this.onBeforePatch(this.state);\n }\n\n if (!this._simulationInterval) {\n this.clock.tick();\n }\n\n if (!this.state) {\n return false;\n }\n\n const hasChanges = this._serializer.applyPatches(this.clients, this.state);\n\n // broadcast messages enqueued for \"after patch\"\n this._dequeueAfterPatchMessages();\n\n return hasChanges;\n }\n\n public onMessage<T = any>(\n messageType: '*',\n callback: (client: Client<UserData, AuthData>, type: string | number, message: T) => void\n );\n public onMessage<T = any>(\n messageType: string | number,\n callback: (client: Client<UserData, AuthData>, message: T) => void,\n validate?: (message: unknown) => T,\n );\n public onMessage<T = any>(\n messageType: '*' | string | number,\n callback: (...args: any[]) => void,\n validate?: (message: unknown) => T,\n ) {\n this.onMessageHandlers[messageType] = { callback, validate };\n // returns a method to unbind the callback\n return () => delete this.onMessageHandlers[messageType];\n }\n\n /**\n * Disconnect all connected clients, and then dispose the room.\n *\n * @param closeCode WebSocket close code (default = 4000, which is a \"consented leave\")\n * @returns Promise<void>\n */\n public disconnect(closeCode: number = Protocol.WS_CLOSE_CONSENTED): Promise<any> {\n // skip if already disposing\n if (this._internalState === RoomInternalState.DISPOSING) {\n return Promise.resolve(`disconnect() ignored: room (${this.roomId}) is already disposing.`);\n\n } else if (this._internalState === RoomInternalState.CREATING) {\n throw new Error(\"cannot disconnect during onCreate()\");\n }\n\n this._internalState = RoomInternalState.DISPOSING;\n this.listing.remove();\n\n this.#_autoDispose = true;\n\n const delayedDisconnection = new Promise<void>((resolve) =>\n this._events.once('disconnect', () => resolve()));\n\n // reject pending reconnections\n for (const [_, reconnection] of Object.values(this._reconnections)) {\n reconnection.reject();\n }\n\n let numClients = this.clients.length;\n if (numClients > 0) {\n // clients may have `async onLeave`, room will be disposed after they're fulfilled\n while (numClients--) {\n this._forciblyCloseClient(this.clients[numClients] as Client & ClientPrivate, closeCode);\n }\n\n } else {\n // no clients connected, dispose immediately.\n this._events.emit('dispose');\n }\n\n return delayedDisconnection;\n }\n\n public async ['_onJoin'](client: Client & ClientPrivate, req?: http.IncomingMessage) {\n const sessionId = client.sessionId;\n\n // generate unique private reconnection token\n client.reconnectionToken = generateId();\n\n if (this.reservedSeatTimeouts[sessionId]) {\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n delete this.reservedSeatTimeouts[sessionId];\n }\n\n // clear auto-dispose timeout.\n if (this._autoDisposeTimeout) {\n clearTimeout(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // get seat reservation options and clear it\n const [joinOptions, authData, isConsumed, isWaitingReconnection] = this.reservedSeats[sessionId];\n\n //\n // TODO: remove this check on 1.0.0\n // - the seat reservation is used to keep track of number of clients and their pending seats (see `hasReachedMaxClients`)\n // - when we fully migrate to static onAuth(), the seat reservation can be removed immediately here\n // - if async onAuth() is in use, the seat reservation is removed after onAuth() is fulfilled.\n // - mark reservation as \"consumed\"\n //\n if (isConsumed) {\n throw new ServerError(ErrorCode.MATCHMAKE_EXPIRED, \"already consumed\");\n }\n this.reservedSeats[sessionId][2] = true; // flag seat reservation as \"consumed\"\n\n // share \"after next patch queue\" reference with every client.\n client._afterNextPatchQueue = this._afterNextPatchQueue;\n\n // add temporary callback to keep track of disconnections during `onJoin`.\n client.ref['onleave'] = (_) => client.state = ClientState.LEAVING;\n client.ref.once('close', client.ref['onleave']);\n\n if (isWaitingReconnection) {\n const previousReconnectionToken = this._reconnectingSessionId.get(sessionId);\n if (previousReconnectionToken) {\n this.clients.push(client);\n //\n // await for reconnection:\n // (end user may customize the reconnection token at this step)\n //\n await this._reconnections[previousReconnectionToken]?.[1].resolve(client);\n\n } else {\n const errorMessage = (process.env.NODE_ENV === 'production')\n ? \"already consumed\" // trick possible fraudsters...\n : \"bad reconnection token\" // ...or developers\n throw new ServerError(ErrorCode.MATCHMAKE_EXPIRED, errorMessage);\n }\n\n } else {\n try {\n if (authData) {\n client.auth = authData;\n\n } else if (this.onAuth !== Room.prototype.onAuth) {\n client.auth = await this.onAuth(client, joinOptions, req);\n\n if (!client.auth) {\n throw new ServerError(ErrorCode.AUTH_FAILED, 'onAuth failed');\n }\n }\n\n //\n // On async onAuth, client may have been disconnected.\n //\n if (client.state === ClientState.LEAVING) {\n throw new ServerError(Protocol.WS_CLOSE_GOING_AWAY, 'already disconnected');\n }\n\n this.clients.push(client);\n\n //\n // Flag sessionId as non-enumarable so hasReachedMaxClients() doesn't count it\n // (https://github.com/colyseus/colyseus/issues/726)\n //\n Object.defineProperty(this.reservedSeats, sessionId, {\n value: this.reservedSeats[sessionId],\n enumerable: false,\n });\n\n if (this.onJoin) {\n await this.onJoin(client, joinOptions, client.auth);\n }\n\n // emit 'join' to room handler\n this._events.emit('join', client);\n\n // remove seat reservation\n delete this.reservedSeats[sessionId];\n\n // client left during `onJoin`, call _onLeave immediately.\n // @ts-ignore\n if (client.state === ClientState.LEAVING) {\n await this._onLeave(client, Protocol.WS_CLOSE_GOING_AWAY);\n }\n\n } catch (e) {\n this.clients.delete(client);\n\n // remove seat reservation\n delete this.reservedSeats[sessionId];\n\n this._decrementClientCount();\n\n // make sure an error code is provided.\n if (!e.code) {\n e.code = ErrorCode.APPLICATION_ERROR;\n }\n\n throw e;\n }\n }\n\n // state might already be ClientState.LEAVING here\n if (client.state === ClientState.JOINING) {\n client.ref.removeListener('close', client.ref['onleave']);\n\n // only bind _onLeave after onJoin has been successful\n client.ref['onleave'] = this._onLeave.bind(this, client);\n client.ref.once('close', client.ref['onleave']);\n\n // allow client to send messages after onJoin has succeeded.\n client.ref.on('message', this._onMessage.bind(this, client));\n\n // confirm room id that matches the room name requested to join\n client.raw(getMessageBytes[Protocol.JOIN_ROOM](\n client.reconnectionToken,\n this._serializer.id,\n this._serializer.handshake && this._serializer.handshake(),\n ));\n }\n }\n\n /**\n * Allow the specified client to reconnect into the room. Must be used inside `onLeave()` method.\n * If seconds is provided, the reconnection is going to be cancelled after the provided amount of seconds.\n *\n * @param previousClient - The client which is to be waiting until re-connection happens.\n * @param seconds - Timeout period on re-connection in seconds.\n *\n * @returns Deferred<Client> - The differed is a promise like type.\n * This type can forcibly reject the promise by calling `.reject()`.\n */\n public allowReconnection(previousClient: Client, seconds: number | \"manual\"): Deferred<Client> {\n //\n // skip reconnection if client has never fully JOINED.\n //\n // (having `_enqueuedMessages !== undefined` means that the client has never\n // been at \"ClientState.JOINED\" state)\n //\n if ((previousClient as unknown as ClientPrivate)._enqueuedMessages !== undefined) {\n return Deferred.reject('client not joined');\n }\n\n if (seconds === undefined) { // TODO: remove this check\n console.warn(\"DEPRECATED: allowReconnection() requires a second argument. Using \\\"manual\\\" mode.\");\n seconds = \"manual\";\n }\n\n if (seconds === \"manual\") {\n seconds = Infinity;\n }\n\n if (this._internalState === RoomInternalState.DISPOSING) {\n this._disposeIfEmpty(); // gracefully shutting down\n return Deferred.reject('disconnecting');\n }\n\n const sessionId = previousClient.sessionId;\n const reconnectionToken = previousClient.reconnectionToken;\n\n this._reserveSeat(sessionId, true, previousClient.auth, seconds, true);\n\n // keep reconnection reference in case the user reconnects into this room.\n const reconnection = new Deferred<Client & ClientPrivate>();\n this._reconnections[reconnectionToken] = [sessionId, reconnection];\n\n if (seconds !== Infinity) {\n // expire seat reservation after timeout\n this.reservedSeatTimeouts[sessionId] = setTimeout(() =>\n reconnection.reject(false), seconds * 1000);\n }\n\n const cleanup = () => {\n delete this._reconnections[reconnectionToken];\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n this._reconnectingSessionId.delete(sessionId);\n };\n\n reconnection.\n then((newClient) => {\n newClient.auth = previousClient.auth;\n newClient.userData = previousClient.userData;\n previousClient.ref = newClient.ref; // swap \"ref\" for convenience\n previousClient.state = ClientState.RECONNECTED;\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n cleanup();\n }).\n catch(() => {\n cleanup();\n this.resetAutoDisposeTimeout();\n });\n\n return reconnection;\n }\n\n protected resetAutoDisposeTimeout(timeoutInSeconds: number = 1) {\n clearTimeout(this._autoDisposeTimeout);\n\n if (!this.#_autoDispose) {\n return;\n }\n\n this._autoDisposeTimeout = setTimeout(() => {\n this._autoDisposeTimeout = undefined;\n this._disposeIfEmpty();\n }, timeoutInSeconds * 1000);\n }\n\n private broadcastMessageType(type: number | string, message?: any | Uint8Array, options: IBroadcastOptions = {}) {\n debugMessage(\"broadcast: %O\", message);\n\n const encodedMessage = (message instanceof Uint8Array)\n ? getMessageBytes.raw(Protocol.ROOM_DATA_BYTES, type, undefined, message)\n : getMessageBytes.raw(Protocol.ROOM_DATA, type, message)\n\n const except = (typeof (options.except) !== \"undefined\")\n ? Array.isArray(options.except)\n ? options.except\n : [options.except]\n : undefined;\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients[numClients];\n\n if (!except || !except.includes(client)) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n protected sendFullState(client: Client): void {\n client.raw(this._serializer.getFullState(client));\n }\n\n protected _dequeueAfterPatchMessages() {\n const length = this._afterNextPatchQueue.length;\n\n if (length > 0) {\n for (let i = 0; i < length; i++) {\n const [target, args] = this._afterNextPatchQueue[i];\n\n if (target === \"broadcast\") {\n this.broadcast.apply(this, args);\n\n } else {\n (target as Client).raw.apply(target, args);\n }\n }\n\n // new messages may have been added in the meantime,\n // let's splice the ones that have been processed\n this._afterNextPatchQueue.splice(0, length);\n }\n }\n\n protected async _reserveSeat(\n sessionId: string,\n joinOptions: any = true,\n authData: any = undefined,\n seconds: number = this.seatReservationTime,\n allowReconnection: boolean = false,\n devModeReconnection?: boolean,\n ) {\n if (!allowReconnection && this.hasReachedMaxClients()) {\n return false;\n }\n\n this.reservedSeats[sessionId] = [joinOptions, authData, false, allowReconnection];\n\n if (!allowReconnection) {\n await this._incrementClientCount();\n\n this.reservedSeatTimeouts[sessionId] = setTimeout(async () => {\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n await this._decrementClientCount();\n }, seconds * 1000);\n\n this.resetAutoDisposeTimeout(seconds);\n }\n\n //\n // isDevMode workaround to allow players to reconnect on devMode\n //\n if (devModeReconnection) {\n this._reconnectingSessionId.set(sessionId, sessionId);\n }\n\n return true;\n }\n\n protected _disposeIfEmpty() {\n const willDispose = (\n this.#_autoDispose &&\n this._autoDisposeTimeout === undefined &&\n this.clients.length === 0 &&\n Object.keys(this.reservedSeats).length === 0\n );\n\n if (willDispose) {\n this._events.emit('dispose');\n }\n\n return willDispose;\n }\n\n protected async _dispose(): Promise<any> {\n this._internalState = RoomInternalState.DISPOSING;\n\n this.listing.remove();\n\n let userReturnData;\n if (this.onDispose) {\n userReturnData = this.onDispose();\n }\n\n if (this.#_patchInterval) {\n clearInterval(this.#_patchInterval);\n this.#_patchInterval = undefined;\n }\n\n if (this._simulationInterval) {\n clearInterval(this._simulationInterval);\n this._simulationInterval = undefined;\n }\n\n if (this._autoDisposeTimeout) {\n clearInterval(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // clear all timeouts/intervals + force to stop ticking\n this.clock.clear();\n this.clock.stop();\n\n return await (userReturnData || Promise.resolve());\n }\n\n protected _onMessage(client: Client & ClientPrivate, buffer: Buffer) {\n // skip if client is on LEAVING state.\n if (client.state === ClientState.LEAVING) { return; }\n\n const it: Iterator = { offset: 1 };\n const code = buffer[0];\n\n if (!buffer) {\n debugAndPrintError(`${this.roomName} (${this.roomId}), couldn't decode message: ${buffer}`);\n return;\n }\n\n if (code === Protocol.ROOM_DATA) {\n const messageType = (decode.stringCheck(buffer, it))\n ? decode.string(buffer, it)\n : decode.number(buffer, it);\n const messageTypeHandler = this.onMessageHandlers[messageType];\n\n let message;\n try {\n message = (buffer.byteLength > it.offset)\n ? unpack(buffer.subarray(it.offset, buffer.byteLength))\n : undefined;\n debugMessage(\"received: '%s' -> %j\", messageType, message);\n\n // custom message validation\n if (messageTypeHandler?.validate !== undefined) {\n message = messageTypeHandler.validate(message);\n }\n\n } catch (e) {\n debugAndPrintError(e);\n client.leave(Protocol.WS_CLOSE_WITH_ERROR);\n return;\n }\n\n if (messageTypeHandler) {\n messageTypeHandler.callback(client, message);\n\n } else {\n (this.onMessageHandlers['*'] || this.onMessageHandlers['__no_message_handler']).callback(client, messageType, message);\n }\n\n } else if (code === Protocol.ROOM_DATA_BYTES) {\n const messageType = (decode.stringCheck(buffer, it))\n ? decode.string(buffer, it)\n : decode.number(buffer, it);\n const messageTypeHandler = this.onMessageHandlers[messageType];\n\n let message = buffer.subarray(it.offset, buffer.byteLength);\n debugMessage(\"received: '%s' -> %j\", messageType, message);\n\n // custom message validation\n if (messageTypeHandler?.validate !== undefined) {\n message = messageTypeHandler.validate(message);\n }\n\n if (messageTypeHandler) {\n messageTypeHandler.callback(client, message);\n\n } else {\n (this.onMessageHandlers['*'] || this.onMessageHandlers['__no_message_handler']).callback(client, messageType, message);\n }\n\n } else if (code === Protocol.JOIN_ROOM && client.state === ClientState.JOINING) {\n // join room has been acknowledged by the client\n client.state = ClientState.JOINED;\n client._joinedAt = this.clock.elapsedTime;\n\n // send current state when new client joins the room\n if (this.state) {\n this.sendFullState(client);\n }\n\n // dequeue messages sent before client has joined effectively (on user-defined `onJoin`)\n if (client._enqueuedMessages.length > 0) {\n client._enqueuedMessages.forEach((enqueued) => client.raw(enqueued));\n }\n delete client._enqueuedMessages;\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this._forciblyCloseClient(client, Protocol.WS_CLOSE_CONSENTED);\n }\n\n }\n\n protected _forciblyCloseClient(client: Client & ClientPrivate, closeCode: number) {\n // stop receiving messages from this client\n client.ref.removeAllListeners('message');\n\n // prevent \"onLeave\" from being called twice if player asks to leave\n client.ref.removeListener('close', client.ref['onleave']);\n\n // only effectively close connection when \"onLeave\" is fulfilled\n this._onLeave(client, closeCode).then(() => client.leave(closeCode));\n }\n\n protected async _onLeave(client: Client, code?: number): Promise<any> {\n const success = this.clients.delete(client);\n\n // call 'onLeave' method only if the client has been successfully accepted.\n if (success) {\n client.state = ClientState.LEAVING;\n\n if (this.onLeave) {\n try {\n await this.onLeave(client, (code === Protocol.WS_CLOSE_CONSENTED));\n\n } catch (e) {\n debugAndPrintError(`onLeave error: ${(e && e.message || e || 'promise rejected')}`);\n }\n }\n }\n\n // check for manual \"reconnection\" flow\n if (this._reconnections[client.reconnectionToken]) {\n this._reconnections[client.reconnectionToken][1].catch(async () => {\n await this._onAfterLeave(client);\n });\n\n } else if (client.state !== ClientState.RECONNECTED) {\n await this._onAfterLeave(client);\n }\n }\n\n protected async _onAfterLeave(client: Client) {\n // try to dispose immediately if client reconnection isn't set up.\n const willDispose = await this._decrementClientCount();\n\n // trigger 'leave' only if seat reservation has been fully consumed\n if (this.reservedSeats[client.sessionId] === undefined) {\n this._events.emit('leave', client, willDispose);\n }\n }\n\n protected async _incrementClientCount() {\n // lock automatically when maxClients is reached\n if (!this._locked && this.hasReachedMaxClients()) {\n this._maxClientsReached = true;\n this.lock.call(this, true);\n }\n\n await this.listing.updateOne({\n $inc: { clients: 1 },\n $set: { locked: this._locked },\n });\n }\n\n protected async _decrementClientCount() {\n const willDispose = this._disposeIfEmpty();\n\n if (this._internalState === RoomInternalState.DISPOSING) {\n return true;\n }\n\n // unlock if room is available for new connections\n if (!willDispose) {\n if (this._maxClientsReached && !this._lockedExplicitly) {\n this._maxClientsReached = false;\n this.unlock.call(this, true);\n }\n\n // update room listing cache\n await this.listing.updateOne({\n $inc: { clients: -1 },\n $set: { locked: this._locked },\n });\n }\n\n return willDispose;\n }\n\n}\n"],
5
- "mappings": "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",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,sBAAuB;AACvB,oBAA2C;AAE3C,mBAAkB;AAClB,oBAA6B;AAC7B,oBAAuB;AAIvB,4BAA+B;AAC/B,8BAAiC;AAGjC,sBAAqD;AACrD,mBAAqC;AACrC,qBAA0B;AAE1B,mBAAiD;AACjD,yBAA4B;AAE5B,uBAA8E;AAE9E,MAAM,qBAAqB,MAAO;AAClC,MAAM,8BAA8B,MAAO;AAC3C,MAAM,iBAAiB,IAAI,qCAAe;AAEnC,MAAM,gCAAgC,OAAO,QAAQ,IAAI,kCAAkC,EAAE;AAQ7F,IAAK,oBAAL,kBAAKA,uBAAL;AACL,EAAAA,sCAAA,cAAW,KAAX;AACA,EAAAA,sCAAA,aAAU,KAAV;AACA,EAAAA,sCAAA,eAAY,KAAZ;AAHU,SAAAA;AAAA,GAAA;AAaL,MAAe,KAA+E;AAAA,EAuHnG,cAAc;AAhGd;AAAA;AAAA;AAAA;AAAA,SAAO,QAAe,IAAI,aAAAC,QAAM;AAUhC;AAAA;AAAA;AAAA;AAAA;AAAA,SAAO,aAAqB;AAO5B;AAAA;AAAA;AAAA;AAAA;AAAA,SAAO,cAAuB;AAQ9B;AAAA;AAAA;AAAA;AAAA;AAAA,SAAO,YAAoB;AAqB3B;AAAA;AAAA;AAAA;AAAA;AAAA,SAAO,UAA2C,IAAI,6BAAY;AAGlE;AAAA,SAAO,UAAU,IAAI,2BAAa;AAGlC;AAAA,SAAU,sBAA8B;AACxC,SAAU,gBAAyE,CAAC;AACpF,SAAU,uBAAgE,CAAC;AAE3E,SAAU,iBAAsE,CAAC;AACjF,SAAQ,yBAAyB,oBAAI,IAAoB;AAEzD,SAAQ,oBAKJ;AAAA,MACA,wBAAwB;AAAA,QACtB,UAAU,CAAC,QAAgB,aAAqB,MAAe;AAC7D,gBAAM,eAAe,kBAAkB,WAAW;AAClD,+CAAmB,YAAY;AAE/B,cAAI,0BAAW;AAEb,mBAAO,MAAM,0BAAU,iBAAiB,YAAY;AAAA,UAEtD,OAAO;AAEL,mBAAO,MAAM,yBAAS,qBAAqB,YAAY;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEF,SAAQ,cAAiC;AACzC,SAAQ,uBAA6D,CAAC;AAItE,SAAQ,iBAAoC;AAC5C,SAAQ,UAAmB;AAC3B,SAAQ,oBAA6B;AACrC,SAAQ,qBAA8B;AAOpC,SAAK,QAAQ,KAAK,WAAW,MAAM;AACjC,WAAK,SAAS,EACX,MAAM,CAAC,UAAM,iCAAmB,oBAAqB,KAAK,EAAE,WAAW,KAAK,kBAAmB,EAAE,CAAC,EAClG,QAAQ,MAAM,KAAK,QAAQ,KAAK,YAAY,CAAC;AAAA,IAClD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EApHA,IAAW,SAAS;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,WAAW;AACpB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAUA;AAAA,EACA;AAAA,EAeA;AAAA,EAQA;AAAA,EACA;AAAA,EA6EU,SAAS;AACjB,QAAI,KAAK,OAAO;AACd,WAAK,SAAS,KAAK,KAAK;AAAA,IAC1B;AAEA,SAAK,gBAAgB,KAAK;AAC1B,SAAK,cAAc,KAAK;AAExB,WAAO,iBAAiB,MAAM;AAAA,MAC5B,aAAa;AAAA,QACX,YAAY;AAAA,QACZ,KAAK,MAAM,KAAK;AAAA,QAChB,KAAK,CAAC,UAAmB;AACvB,cACE,UAAU,KAAK,iBACf,KAAK,mBAAmB,mBACxB;AACA,iBAAK,gBAAgB;AACrB,iBAAK,wBAAwB;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,WAAW;AAAA,QACT,YAAY;AAAA,QACZ,KAAK,MAAM,KAAK;AAAA,QAChB,KAAK,CAAC,iBAAyB;AAC7B,eAAK,cAAc;AAEnB,cAAI,KAAK,iBAAiB;AACxB,0BAAc,KAAK,eAAe;AAClC,iBAAK,kBAAkB;AAAA,UACzB;AACA,cAAI,iBAAiB,QAAQ,iBAAiB,GAAG;AAC/C,iBAAK,kBAAkB,YAAY,MAAM,KAAK,eAAe,GAAG,YAAY;AAAA,UAC9E;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAGD,SAAK,YAAY,KAAK;AAGtB,SAAK,wBAAwB,KAAK,mBAAmB;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,WAAW;AAAE,WAAO,KAAK;AAAA,EAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhD,IAAW,SAAS,UAAkB;AACpC,QAAI,KAAK,YAAY;AAEnB,YAAM,IAAI,+BAAY,0BAAU,mBAAmB,mCAAmC;AAAA,IACxF;AACA,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAW,SAAS;AAAE,WAAO,KAAK;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5C,IAAW,OAAO,QAAgB;AAChC,QAAI,KAAK,mBAAmB,oBAA8B,CAAC,0BAAW;AAEpE,YAAM,IAAI,+BAAY,0BAAU,mBAAmB,qDAAqD;AAAA,IAC1G;AACA,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeO,OAAO,QAAoC,SAAc,SAAoD;AAClH,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,OAAO,OAAe,KAAwC;AACzE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBO,uBAAgC;AACrC,WACG,KAAK,QAAQ,SAAS,OAAO,KAAK,KAAK,aAAa,EAAE,UAAW,KAAK,cACvE,KAAK,mBAAmB;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaO,uBAAuB,SAAiB;AAC7C,SAAK,sBAAsB;AAC3B,WAAO;AAAA,EACT;AAAA,EAEO,gBAAgB,WAAmB,mBAAqC;AAC7E,UAAM,eAAe,KAAK,cAAc,SAAS;AAGjD,QAAI,iBAAiB,QAAW;AAC9B,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,CAAC,GAAG;AAEnB,aACE,qBACA,KAAK,eAAe,iBAAiB,IAAI,CAAC,MAAM,aAChD,KAAK,uBAAuB,IAAI,SAAS;AAAA,IAG7C,OAAO;AAEL,aAAO,aAAa,CAAC,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EAEO,uBAAuB,mBAA2B;AACvD,UAAM,YAAY,KAAK,eAAe,iBAAiB,IAAI,CAAC;AAC5D,UAAM,eAAe,KAAK,cAAc,SAAS;AAEjD,QAAI,gBAAgB,aAAa,CAAC,GAAG;AACnC,WAAK,uBAAuB,IAAI,WAAW,iBAAiB;AAC5D,aAAO;AAAA,IAET,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,sBAAsB,gBAAqC,QAAgB,6BAAmC;AAEnH,QAAI,KAAK,qBAAqB;AAAE,oBAAc,KAAK,mBAAmB;AAAA,IAAG;AAEzE,QAAI,gBAAgB;AAClB,WAAK,sBAAsB,YAAY,MAAM;AAC3C,aAAK,MAAM,KAAK;AAChB,uBAAe,KAAK,MAAM,SAAS;AAAA,MACrC,GAAG,KAAK;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,cAAmC;AACrD,SAAK,YAAY;AAAA,EACnB;AAAA,EAEO,SAAS,UAAiB;AAC/B,SAAK,MAAM,MAAM;AAEjB,QAAI,SAAS,sBAAQ,MAAM,QAAW;AACpC,WAAK,cAAc,IAAI,yCAAiB,CAAC;AAAA,IAE3C,WAAW,2BAAa,QAAW;AACjC,YAAM,IAAI,MAAM,gFAAgF;AAAA,IAClG;AAEA,SAAK,YAAY,MAAM,QAAQ;AAE/B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,cAAc,YAA+B;AAClD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAa,YAAY,MAAyB;AAChD,QAAI,CAAC,KAAK,QAAQ,UAAU;AAC1B,WAAK,QAAQ,WAAW;AAAA,IAE1B,OAAO;AACL,iBAAW,SAAS,MAAM;AACxB,YAAI,CAAC,KAAK,eAAe,KAAK,GAAG;AAAE;AAAA,QAAU;AAC7C,aAAK,QAAQ,SAAS,KAAK,IAAI,KAAK,KAAK;AAAA,MAC3C;AAGA,UAAI,kBAAkB,KAAK,SAAS;AAClC,QAAC,KAAK,QAAgB,aAAa,UAAU;AAAA,MAC/C;AAAA,IACF;AAEA,QAAI,KAAK,mBAAmB,iBAA2B;AACrD,YAAM,KAAK,QAAQ,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAa,WAAW,OAAgB,MAAM;AAC5C,QAAI,KAAK,QAAQ,YAAY,KAAM;AAEnC,SAAK,QAAQ,UAAU;AAEvB,QAAI,KAAK,mBAAmB,iBAA2B;AACrD,YAAM,KAAK,QAAQ,KAAK;AAAA,IAC1B;AAEA,SAAK,QAAQ,KAAK,qBAAqB,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO;AAElB,SAAK,oBAAqB,UAAU,CAAC,MAAM;AAG3C,QAAI,KAAK,SAAS;AAAE;AAAA,IAAQ;AAE5B,SAAK,UAAU;AAEf,UAAM,KAAK,QAAQ,UAAU;AAAA,MAC3B,MAAM,EAAE,QAAQ,KAAK,QAAQ;AAAA,IAC/B,CAAC;AAED,SAAK,QAAQ,KAAK,MAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,SAAS;AAEpB,QAAI,UAAU,CAAC,MAAM,QAAW;AAC9B,WAAK,oBAAoB;AAAA,IAC3B;AAGA,QAAI,CAAC,KAAK,SAAS;AAAE;AAAA,IAAQ;AAE7B,SAAK,UAAU;AAEf,UAAM,KAAK,QAAQ,UAAU;AAAA,MAC3B,MAAM,EAAE,QAAQ,KAAK,QAAQ;AAAA,IAC/B,CAAC;AAED,SAAK,QAAQ,KAAK,QAAQ;AAAA,EAC5B;AAAA,EAGO,KAAK,QAAgB,eAAoB,kBAAuC,SAA8B;AACnH,yBAAO,KAAK,6EAA6E;AACzF,WAAO,KAAK,eAAe,kBAAkB,OAAO;AAAA,EACtD;AAAA,EAEO,UAAU,MAAuB,SAAe,SAA6B;AAClF,QAAI,WAAW,QAAQ,gBAAgB;AACrC,aAAO,QAAQ;AACf,WAAK,qBAAqB,KAAK,CAAC,aAAa,SAAS,CAAC;AACvD;AAAA,IACF;AAEA,SAAK,qBAAqB,MAAM,SAAS,OAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,MAAuB,SAAqB,SAA4B;AAC5F,QAAI,WAAW,QAAQ,gBAAgB;AACrC,aAAO,QAAQ;AACf,WAAK,qBAAqB,KAAK,CAAC,kBAAkB,SAAS,CAAC;AAC5D;AAAA,IACF;AAEA,SAAK,qBAAqB,MAAgB,SAAS,OAAO;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAiB;AACtB,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,KAAK,KAAK;AAAA,IAC/B;AAEA,QAAI,CAAC,KAAK,qBAAqB;AAC7B,WAAK,MAAM,KAAK;AAAA,IAClB;AAEA,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,YAAY,aAAa,KAAK,SAAS,KAAK,KAAK;AAGzE,SAAK,2BAA2B;AAEhC,WAAO;AAAA,EACT;AAAA,EAWO,UACL,aACA,UACA,UACA;AACA,SAAK,kBAAkB,WAAW,IAAI,EAAE,UAAU,SAAS;AAE3D,WAAO,MAAM,OAAO,KAAK,kBAAkB,WAAW;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAW,YAAoB,yBAAS,oBAAkC;AAE/E,QAAI,KAAK,mBAAmB,mBAA6B;AACvD,aAAO,QAAQ,QAAQ,+BAA+B,KAAK,MAAM,yBAAyB;AAAA,IAE5F,WAAW,KAAK,mBAAmB,kBAA4B;AAC7D,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,SAAK,iBAAiB;AACtB,SAAK,QAAQ,OAAO;AAEpB,SAAK,gBAAgB;AAErB,UAAM,uBAAuB,IAAI,QAAc,CAAC,YAC9C,KAAK,QAAQ,KAAK,cAAc,MAAM,QAAQ,CAAC,CAAC;AAGlD,eAAW,CAAC,GAAG,YAAY,KAAK,OAAO,OAAO,KAAK,cAAc,GAAG;AAClE,mBAAa,OAAO;AAAA,IACtB;AAEA,QAAI,aAAa,KAAK,QAAQ;AAC9B,QAAI,aAAa,GAAG;AAElB,aAAO,cAAc;AACnB,aAAK,qBAAqB,KAAK,QAAQ,UAAU,GAA6B,SAAS;AAAA,MACzF;AAAA,IAEF,OAAO;AAEL,WAAK,QAAQ,KAAK,SAAS;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAc,SAAS,EAAE,QAAgC,KAA4B;AACnF,UAAM,YAAY,OAAO;AAGzB,WAAO,wBAAoB,yBAAW;AAEtC,QAAI,KAAK,qBAAqB,SAAS,GAAG;AACxC,mBAAa,KAAK,qBAAqB,SAAS,CAAC;AACjD,aAAO,KAAK,qBAAqB,SAAS;AAAA,IAC5C;AAGA,QAAI,KAAK,qBAAqB;AAC5B,mBAAa,KAAK,mBAAmB;AACrC,WAAK,sBAAsB;AAAA,IAC7B;AAGA,UAAM,CAAC,aAAa,UAAU,YAAY,qBAAqB,IAAI,KAAK,cAAc,SAAS;AAS/F,QAAI,YAAY;AACd,YAAM,IAAI,+BAAY,0BAAU,mBAAmB,kBAAkB;AAAA,IACvE;AACA,SAAK,cAAc,SAAS,EAAE,CAAC,IAAI;AAGnC,WAAO,uBAAuB,KAAK;AAGnC,WAAO,IAAI,SAAS,IAAI,CAAC,MAAM,OAAO,QAAQ,6BAAY;AAC1D,WAAO,IAAI,KAAK,SAAS,OAAO,IAAI,SAAS,CAAC;AAE9C,QAAI,uBAAuB;AACzB,YAAM,4BAA4B,KAAK,uBAAuB,IAAI,SAAS;AAC3E,UAAI,2BAA2B;AAC7B,aAAK,QAAQ,KAAK,MAAM;AAKxB,cAAM,KAAK,eAAe,yBAAyB,IAAI,CAAC,EAAE,QAAQ,MAAM;AAAA,MAE1E,OAAO;AACL,cAAM,eAAgB,QAAQ,IAAI,aAAa,eAC3C,qBACA;AACJ,cAAM,IAAI,+BAAY,0BAAU,mBAAmB,YAAY;AAAA,MACjE;AAAA,IAEF,OAAO;AACL,UAAI;AACF,YAAI,UAAU;AACZ,iBAAO,OAAO;AAAA,QAEhB,WAAW,KAAK,WAAW,KAAK,UAAU,QAAQ;AAChD,iBAAO,OAAO,MAAM,KAAK,OAAO,QAAQ,aAAa,GAAG;AAExD,cAAI,CAAC,OAAO,MAAM;AAChB,kBAAM,IAAI,+BAAY,0BAAU,aAAa,eAAe;AAAA,UAC9D;AAAA,QACF;AAKA,YAAI,OAAO,UAAU,6BAAY,SAAS;AACxC,gBAAM,IAAI,+BAAY,yBAAS,qBAAqB,sBAAsB;AAAA,QAC5E;AAEA,aAAK,QAAQ,KAAK,MAAM;AAMxB,eAAO,eAAe,KAAK,eAAe,WAAW;AAAA,UACnD,OAAO,KAAK,cAAc,SAAS;AAAA,UACnC,YAAY;AAAA,QACd,CAAC;AAED,YAAI,KAAK,QAAQ;AACf,gBAAM,KAAK,OAAO,QAAQ,aAAa,OAAO,IAAI;AAAA,QACpD;AAGA,aAAK,QAAQ,KAAK,QAAQ,MAAM;AAGhC,eAAO,KAAK,cAAc,SAAS;AAInC,YAAI,OAAO,UAAU,6BAAY,SAAS;AACxC,gBAAM,KAAK,SAAS,QAAQ,yBAAS,mBAAmB;AAAA,QAC1D;AAAA,MAEF,SAAS,GAAG;AACV,aAAK,QAAQ,OAAO,MAAM;AAG1B,eAAO,KAAK,cAAc,SAAS;AAEnC,aAAK,sBAAsB;AAG3B,YAAI,CAAC,EAAE,MAAM;AACX,YAAE,OAAO,0BAAU;AAAA,QACrB;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAGA,QAAI,OAAO,UAAU,6BAAY,SAAS;AACxC,aAAO,IAAI,eAAe,SAAS,OAAO,IAAI,SAAS,CAAC;AAGxD,aAAO,IAAI,SAAS,IAAI,KAAK,SAAS,KAAK,MAAM,MAAM;AACvD,aAAO,IAAI,KAAK,SAAS,OAAO,IAAI,SAAS,CAAC;AAG9C,aAAO,IAAI,GAAG,WAAW,KAAK,WAAW,KAAK,MAAM,MAAM,CAAC;AAG3D,aAAO,IAAI,gCAAgB,yBAAS,SAAS;AAAA,QAC3C,OAAO;AAAA,QACP,KAAK,YAAY;AAAA,QACjB,KAAK,YAAY,aAAa,KAAK,YAAY,UAAU;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,kBAAkB,gBAAwB,SAA8C;AAO7F,QAAK,eAA4C,sBAAsB,QAAW;AAChF,aAAO,sBAAS,OAAO,mBAAmB;AAAA,IAC5C;AAEA,QAAI,YAAY,QAAW;AACzB,cAAQ,KAAK,kFAAoF;AACjG,gBAAU;AAAA,IACZ;AAEA,QAAI,YAAY,UAAU;AACxB,gBAAU;AAAA,IACZ;AAEA,QAAI,KAAK,mBAAmB,mBAA6B;AACvD,WAAK,gBAAgB;AACrB,aAAO,sBAAS,OAAO,eAAe;AAAA,IACxC;AAEA,UAAM,YAAY,eAAe;AACjC,UAAM,oBAAoB,eAAe;AAEzC,SAAK,aAAa,WAAW,MAAM,eAAe,MAAM,SAAS,IAAI;AAGrE,UAAM,eAAe,IAAI,sBAAiC;AAC1D,SAAK,eAAe,iBAAiB,IAAI,CAAC,WAAW,YAAY;AAEjE,QAAI,YAAY,UAAU;AAExB,WAAK,qBAAqB,SAAS,IAAI,WAAW,MAChD,aAAa,OAAO,KAAK,GAAG,UAAU,GAAI;AAAA,IAC9C;AAEA,UAAM,UAAU,MAAM;AACpB,aAAO,KAAK,eAAe,iBAAiB;AAC5C,aAAO,KAAK,cAAc,SAAS;AACnC,aAAO,KAAK,qBAAqB,SAAS;AAC1C,WAAK,uBAAuB,OAAO,SAAS;AAAA,IAC9C;AAEA,iBACE,KAAK,CAAC,cAAc;AAClB,gBAAU,OAAO,eAAe;AAChC,gBAAU,WAAW,eAAe;AACpC,qBAAe,MAAM,UAAU;AAC/B,qBAAe,QAAQ,6BAAY;AACnC,mBAAa,KAAK,qBAAqB,SAAS,CAAC;AACjD,cAAQ;AAAA,IACV,CAAC,EACD,MAAM,MAAM;AACV,cAAQ;AACR,WAAK,wBAAwB;AAAA,IAC/B,CAAC;AAEH,WAAO;AAAA,EACT;AAAA,EAEU,wBAAwB,mBAA2B,GAAG;AAC9D,iBAAa,KAAK,mBAAmB;AAErC,QAAI,CAAC,KAAK,eAAe;AACvB;AAAA,IACF;AAEA,SAAK,sBAAsB,WAAW,MAAM;AAC1C,WAAK,sBAAsB;AAC3B,WAAK,gBAAgB;AAAA,IACvB,GAAG,mBAAmB,GAAI;AAAA,EAC5B;AAAA,EAEQ,qBAAqB,MAAuB,SAA4B,UAA6B,CAAC,GAAG;AAC/G,mCAAa,iBAAiB,OAAO;AAErC,UAAM,iBAAkB,mBAAmB,aACvC,gCAAgB,IAAI,yBAAS,iBAAiB,MAAM,QAAW,OAAO,IACtE,gCAAgB,IAAI,yBAAS,WAAW,MAAM,OAAO;AAEzD,UAAM,SAAU,OAAQ,QAAQ,WAAY,cACxC,MAAM,QAAQ,QAAQ,MAAM,IAC1B,QAAQ,SACR,CAAC,QAAQ,MAAM,IACjB;AAEJ,QAAI,aAAa,KAAK,QAAQ;AAC9B,WAAO,cAAc;AACnB,YAAM,SAAS,KAAK,QAAQ,UAAU;AAEtC,UAAI,CAAC,UAAU,CAAC,OAAO,SAAS,MAAM,GAAG;AACvC,eAAO,WAAW,cAAc;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEU,cAAc,QAAsB;AAC5C,WAAO,IAAI,KAAK,YAAY,aAAa,MAAM,CAAC;AAAA,EAClD;AAAA,EAEU,6BAA6B;AACrC,UAAM,SAAS,KAAK,qBAAqB;AAEzC,QAAI,SAAS,GAAG;AACd,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,cAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,qBAAqB,CAAC;AAElD,YAAI,WAAW,aAAa;AAC1B,eAAK,UAAU,MAAM,MAAM,IAAI;AAAA,QAEjC,OAAO;AACL,UAAC,OAAkB,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC3C;AAAA,MACF;AAIA,WAAK,qBAAqB,OAAO,GAAG,MAAM;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAgB,aACd,WACA,cAAmB,MACnB,WAAgB,QAChB,UAAkB,KAAK,qBACvB,oBAA6B,OAC7B,qBACA;AACA,QAAI,CAAC,qBAAqB,KAAK,qBAAqB,GAAG;AACrD,aAAO;AAAA,IACT;AAEA,SAAK,cAAc,SAAS,IAAI,CAAC,aAAa,UAAU,OAAO,iBAAiB;AAEhF,QAAI,CAAC,mBAAmB;AACtB,YAAM,KAAK,sBAAsB;AAEjC,WAAK,qBAAqB,SAAS,IAAI,WAAW,YAAY;AAC5D,eAAO,KAAK,cAAc,SAAS;AACnC,eAAO,KAAK,qBAAqB,SAAS;AAC1C,cAAM,KAAK,sBAAsB;AAAA,MACnC,GAAG,UAAU,GAAI;AAEjB,WAAK,wBAAwB,OAAO;AAAA,IACtC;AAKA,QAAI,qBAAqB;AACvB,WAAK,uBAAuB,IAAI,WAAW,SAAS;AAAA,IACtD;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,kBAAkB;AAC1B,UAAM,cACJ,KAAK,iBACL,KAAK,wBAAwB,UAC7B,KAAK,QAAQ,WAAW,KACxB,OAAO,KAAK,KAAK,aAAa,EAAE,WAAW;AAG7C,QAAI,aAAa;AACf,WAAK,QAAQ,KAAK,SAAS;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,WAAyB;AACvC,SAAK,iBAAiB;AAEtB,SAAK,QAAQ,OAAO;AAEpB,QAAI;AACJ,QAAI,KAAK,WAAW;AAClB,uBAAiB,KAAK,UAAU;AAAA,IAClC;AAEA,QAAI,KAAK,iBAAiB;AACxB,oBAAc,KAAK,eAAe;AAClC,WAAK,kBAAkB;AAAA,IACzB;AAEA,QAAI,KAAK,qBAAqB;AAC5B,oBAAc,KAAK,mBAAmB;AACtC,WAAK,sBAAsB;AAAA,IAC7B;AAEA,QAAI,KAAK,qBAAqB;AAC5B,oBAAc,KAAK,mBAAmB;AACtC,WAAK,sBAAsB;AAAA,IAC7B;AAGA,SAAK,MAAM,MAAM;AACjB,SAAK,MAAM,KAAK;AAEhB,WAAO,OAAO,kBAAkB,QAAQ,QAAQ;AAAA,EAClD;AAAA,EAEU,WAAW,QAAgC,QAAgB;AAEnE,QAAI,OAAO,UAAU,6BAAY,SAAS;AAAE;AAAA,IAAQ;AAEpD,UAAM,KAAe,EAAE,QAAQ,EAAE;AACjC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,CAAC,QAAQ;AACX,2CAAmB,GAAG,KAAK,QAAQ,KAAK,KAAK,MAAM,+BAA+B,MAAM,EAAE;AAC1F;AAAA,IACF;AAEA,QAAI,SAAS,yBAAS,WAAW;AAC/B,YAAM,cAAe,qBAAO,YAAY,QAAQ,EAAE,IAC9C,qBAAO,OAAO,QAAQ,EAAE,IACxB,qBAAO,OAAO,QAAQ,EAAE;AAC5B,YAAM,qBAAqB,KAAK,kBAAkB,WAAW;AAE7D,UAAI;AACJ,UAAI;AACF,kBAAW,OAAO,aAAa,GAAG,aAC9B,wBAAO,OAAO,SAAS,GAAG,QAAQ,OAAO,UAAU,CAAC,IACpD;AACJ,uCAAa,wBAAwB,aAAa,OAAO;AAGzD,YAAI,oBAAoB,aAAa,QAAW;AAC9C,oBAAU,mBAAmB,SAAS,OAAO;AAAA,QAC/C;AAAA,MAEF,SAAS,GAAG;AACV,6CAAmB,CAAC;AACpB,eAAO,MAAM,yBAAS,mBAAmB;AACzC;AAAA,MACF;AAEA,UAAI,oBAAoB;AACtB,2BAAmB,SAAS,QAAQ,OAAO;AAAA,MAE7C,OAAO;AACL,SAAC,KAAK,kBAAkB,GAAG,KAAK,KAAK,kBAAkB,sBAAsB,GAAG,SAAS,QAAQ,aAAa,OAAO;AAAA,MACvH;AAAA,IAEF,WAAW,SAAS,yBAAS,iBAAiB;AAC5C,YAAM,cAAe,qBAAO,YAAY,QAAQ,EAAE,IAC9C,qBAAO,OAAO,QAAQ,EAAE,IACxB,qBAAO,OAAO,QAAQ,EAAE;AAC5B,YAAM,qBAAqB,KAAK,kBAAkB,WAAW;AAE7D,UAAI,UAAU,OAAO,SAAS,GAAG,QAAQ,OAAO,UAAU;AAC1D,qCAAa,wBAAwB,aAAa,OAAO;AAGzD,UAAI,oBAAoB,aAAa,QAAW;AAC9C,kBAAU,mBAAmB,SAAS,OAAO;AAAA,MAC/C;AAEA,UAAI,oBAAoB;AACtB,2BAAmB,SAAS,QAAQ,OAAO;AAAA,MAE7C,OAAO;AACL,SAAC,KAAK,kBAAkB,GAAG,KAAK,KAAK,kBAAkB,sBAAsB,GAAG,SAAS,QAAQ,aAAa,OAAO;AAAA,MACvH;AAAA,IAEF,WAAW,SAAS,yBAAS,aAAa,OAAO,UAAU,6BAAY,SAAS;AAE9E,aAAO,QAAQ,6BAAY;AAC3B,aAAO,YAAY,KAAK,MAAM;AAG9B,UAAI,KAAK,OAAO;AACd,aAAK,cAAc,MAAM;AAAA,MAC3B;AAGA,UAAI,OAAO,kBAAkB,SAAS,GAAG;AACvC,eAAO,kBAAkB,QAAQ,CAAC,aAAa,OAAO,IAAI,QAAQ,CAAC;AAAA,MACrE;AACA,aAAO,OAAO;AAAA,IAEhB,WAAW,SAAS,yBAAS,YAAY;AACvC,WAAK,qBAAqB,QAAQ,yBAAS,kBAAkB;AAAA,IAC/D;AAAA,EAEF;AAAA,EAEU,qBAAqB,QAAgC,WAAmB;AAEhF,WAAO,IAAI,mBAAmB,SAAS;AAGvC,WAAO,IAAI,eAAe,SAAS,OAAO,IAAI,SAAS,CAAC;AAGxD,SAAK,SAAS,QAAQ,SAAS,EAAE,KAAK,MAAM,OAAO,MAAM,SAAS,CAAC;AAAA,EACrE;AAAA,EAEA,MAAgB,SAAS,QAAgB,MAA6B;AACpE,UAAM,UAAU,KAAK,QAAQ,OAAO,MAAM;AAG1C,QAAI,SAAS;AACX,aAAO,QAAQ,6BAAY;AAE3B,UAAI,KAAK,SAAS;AAChB,YAAI;AACF,gBAAM,KAAK,QAAQ,QAAS,SAAS,yBAAS,kBAAmB;AAAA,QAEnE,SAAS,GAAG;AACV,+CAAmB,kBAAmB,KAAK,EAAE,WAAW,KAAK,kBAAmB,EAAE;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,eAAe,OAAO,iBAAiB,GAAG;AACjD,WAAK,eAAe,OAAO,iBAAiB,EAAE,CAAC,EAAE,MAAM,YAAY;AACjE,cAAM,KAAK,cAAc,MAAM;AAAA,MACjC,CAAC;AAAA,IAEH,WAAW,OAAO,UAAU,6BAAY,aAAa;AACnD,YAAM,KAAK,cAAc,MAAM;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAgB,cAAc,QAAgB;AAE5C,UAAM,cAAc,MAAM,KAAK,sBAAsB;AAGrD,QAAI,KAAK,cAAc,OAAO,SAAS,MAAM,QAAW;AACtD,WAAK,QAAQ,KAAK,SAAS,QAAQ,WAAW;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAgB,wBAAwB;AAEtC,QAAI,CAAC,KAAK,WAAW,KAAK,qBAAqB,GAAG;AAChD,WAAK,qBAAqB;AAC1B,WAAK,KAAK,KAAK,MAAM,IAAI;AAAA,IAC3B;AAEA,UAAM,KAAK,QAAQ,UAAU;AAAA,MAC3B,MAAM,EAAE,SAAS,EAAE;AAAA,MACnB,MAAM,EAAE,QAAQ,KAAK,QAAQ;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,MAAgB,wBAAwB;AACtC,UAAM,cAAc,KAAK,gBAAgB;AAEzC,QAAI,KAAK,mBAAmB,mBAA6B;AACvD,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,aAAa;AAChB,UAAI,KAAK,sBAAsB,CAAC,KAAK,mBAAmB;AACtD,aAAK,qBAAqB;AAC1B,aAAK,OAAO,KAAK,MAAM,IAAI;AAAA,MAC7B;AAGA,YAAM,KAAK,QAAQ,UAAU;AAAA,QAC3B,MAAM,EAAE,SAAS,GAAG;AAAA,QACpB,MAAM,EAAE,QAAQ,KAAK,QAAQ;AAAA,MAC/B,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAEF;",
6
6
  "names": ["RoomInternalState", "Clock"]
7
7
  }
package/build/Room.mjs CHANGED
@@ -23,12 +23,38 @@ var RoomInternalState = /* @__PURE__ */ ((RoomInternalState2) => {
23
23
  })(RoomInternalState || {});
24
24
  class Room {
25
25
  constructor() {
26
+ /**
27
+ * Timing events tied to the room instance.
28
+ * Intervals and timeouts are cleared when the room is disposed.
29
+ */
26
30
  this.clock = new Clock();
31
+ /**
32
+ * Maximum number of clients allowed to connect into the room. When room reaches this limit,
33
+ * it is locked automatically. Unless the room was explicitly locked by you via `lock()` method,
34
+ * the room will be unlocked as soon as a client disconnects from it.
35
+ */
27
36
  this.maxClients = Infinity;
37
+ /**
38
+ * Automatically dispose the room when last client disconnects.
39
+ *
40
+ * @default true
41
+ */
28
42
  this.autoDispose = true;
43
+ /**
44
+ * Frequency to send the room state to connected clients, in milliseconds.
45
+ *
46
+ * @default 50ms (20fps)
47
+ */
29
48
  this.patchRate = DEFAULT_PATCH_RATE;
49
+ /**
50
+ * The array of connected clients.
51
+ *
52
+ * @see {@link https://docs.colyseus.io/colyseus/server/room/#client|Client instance}
53
+ */
30
54
  this.clients = new ClientArray();
55
+ /** @internal */
31
56
  this._events = new EventEmitter();
57
+ // seat reservation & reconnection
32
58
  this.seatReservationTime = DEFAULT_SEAT_RESERVATION_TIME;
33
59
  this.reservedSeats = {};
34
60
  this.reservedSeatTimeouts = {};
@@ -57,6 +83,13 @@ class Room {
57
83
  this._dispose().catch((e) => debugAndPrintError(`onDispose error: ${e && e.message || e || "promise rejected"}`)).finally(() => this._events.emit("disconnect"));
58
84
  });
59
85
  }
86
+ /**
87
+ * This property will change on these situations:
88
+ * - The maximum number of allowed clients has been reached (`maxClients`)
89
+ * - You manually locked, or unlocked the room using lock() or `unlock()`.
90
+ *
91
+ * @readonly
92
+ */
60
93
  get locked() {
61
94
  return this._locked;
62
95
  }
@@ -103,33 +136,77 @@ class Room {
103
136
  this.patchRate = this.#_patchRate;
104
137
  this.resetAutoDisposeTimeout(this.seatReservationTime);
105
138
  }
139
+ /**
140
+ * The name of the room you provided as first argument for `gameServer.define()`.
141
+ *
142
+ * @returns roomName string
143
+ */
106
144
  get roomName() {
107
145
  return this.#_roomName;
108
146
  }
147
+ /**
148
+ * Setting the name of the room. Overwriting this property is restricted.
149
+ *
150
+ * @param roomName
151
+ */
109
152
  set roomName(roomName) {
110
153
  if (this.#_roomName) {
111
154
  throw new ServerError(ErrorCode.APPLICATION_ERROR, "'roomName' cannot be overwritten.");
112
155
  }
113
156
  this.#_roomName = roomName;
114
157
  }
158
+ /**
159
+ * A unique, auto-generated, 9-character-long id of the room.
160
+ * You may replace `this.roomId` during `onCreate()`.
161
+ *
162
+ * @returns roomId string
163
+ */
115
164
  get roomId() {
116
165
  return this.#_roomId;
117
166
  }
167
+ /**
168
+ * Setting the roomId, is restricted in room lifetime except upon room creation.
169
+ *
170
+ * @param roomId
171
+ * @returns roomId string
172
+ */
118
173
  set roomId(roomId) {
119
174
  if (this._internalState !== 0 /* CREATING */ && !isDevMode) {
120
175
  throw new ServerError(ErrorCode.APPLICATION_ERROR, "'roomId' can only be overridden upon room creation.");
121
176
  }
122
177
  this.#_roomId = roomId;
123
178
  }
179
+ // TODO: flag as @deprecated on v0.16
180
+ // TOOD: remove instance level `onAuth` on 1.0
181
+ /**
182
+ * onAuth at the instance level will be deprecated in the future.
183
+ * Please use "static onAuth(token, req) instead
184
+ */
124
185
  onAuth(client, options, request) {
125
186
  return true;
126
187
  }
127
188
  static async onAuth(token, req) {
128
189
  return true;
129
190
  }
191
+ /**
192
+ * Returns whether the sum of connected clients and reserved seats exceeds maximum number of clients.
193
+ *
194
+ * @returns boolean
195
+ */
130
196
  hasReachedMaxClients() {
131
197
  return this.clients.length + Object.keys(this.reservedSeats).length >= this.maxClients || this._internalState === 2 /* DISPOSING */;
132
198
  }
199
+ /**
200
+ * Set the number of seconds a room can wait for a client to effectively join the room.
201
+ * You should consider how long your `onAuth()` will have to wait for setting a different seat reservation time.
202
+ * The default value is 15 seconds. You may set the `COLYSEUS_SEAT_RESERVATION_TIME`
203
+ * environment variable if you'd like to change the seat reservation time globally.
204
+ *
205
+ * @default 15 seconds
206
+ *
207
+ * @param seconds - number of seconds.
208
+ * @returns The modified Room object.
209
+ */
133
210
  setSeatReservationTime(seconds) {
134
211
  this.seatReservationTime = seconds;
135
212
  return this;
@@ -155,6 +232,16 @@ class Room {
155
232
  return void 0;
156
233
  }
157
234
  }
235
+ /**
236
+ * (Optional) Set a simulation interval that can change the state of the game.
237
+ * The simulation interval is your game loop.
238
+ *
239
+ * @default 16.6ms (60fps)
240
+ *
241
+ * @param onTickCallback - You can implement your physics or world updates here!
242
+ * This is a good place to update the room state.
243
+ * @param delay - Interval delay on executing `onTickCallback` in milliseconds.
244
+ */
158
245
  setSimulationInterval(onTickCallback, delay = DEFAULT_SIMULATION_INTERVAL) {
159
246
  if (this._simulationInterval) {
160
247
  clearInterval(this._simulationInterval);
@@ -166,6 +253,9 @@ class Room {
166
253
  }, delay);
167
254
  }
168
255
  }
256
+ /**
257
+ * @deprecated Use `.patchRate=` instead.
258
+ */
169
259
  setPatchRate(milliseconds) {
170
260
  this.patchRate = milliseconds;
171
261
  }
@@ -201,14 +291,16 @@ class Room {
201
291
  }
202
292
  }
203
293
  async setPrivate(bool = true) {
204
- if (this.listing.private === bool)
205
- return;
294
+ if (this.listing.private === bool) return;
206
295
  this.listing.private = bool;
207
296
  if (this._internalState === 1 /* CREATED */) {
208
297
  await this.listing.save();
209
298
  }
210
299
  this._events.emit("visibility-change", bool);
211
300
  }
301
+ /**
302
+ * Locking the room will remove it from the pool of available rooms for new clients to connect to.
303
+ */
212
304
  async lock() {
213
305
  this._lockedExplicitly = arguments[0] === void 0;
214
306
  if (this._locked) {
@@ -220,6 +312,9 @@ class Room {
220
312
  });
221
313
  this._events.emit("lock");
222
314
  }
315
+ /**
316
+ * Unlocking the room returns it to the pool of available rooms for new clients to connect to.
317
+ */
223
318
  async unlock() {
224
319
  if (arguments[0] === void 0) {
225
320
  this._lockedExplicitly = false;
@@ -245,6 +340,9 @@ class Room {
245
340
  }
246
341
  this.broadcastMessageType(type, message, options);
247
342
  }
343
+ /**
344
+ * Broadcast bytes (UInt8Arrays) to a particular room
345
+ */
248
346
  broadcastBytes(type, message, options) {
249
347
  if (options && options.afterNextPatch) {
250
348
  delete options.afterNextPatch;
@@ -253,6 +351,9 @@ class Room {
253
351
  }
254
352
  this.broadcastMessageType(type, message, options);
255
353
  }
354
+ /**
355
+ * Checks whether mutations have occurred in the state, and broadcast them to all connected clients.
356
+ */
256
357
  broadcastPatch() {
257
358
  if (this.onBeforePatch) {
258
359
  this.onBeforePatch(this.state);
@@ -271,6 +372,12 @@ class Room {
271
372
  this.onMessageHandlers[messageType] = { callback, validate };
272
373
  return () => delete this.onMessageHandlers[messageType];
273
374
  }
375
+ /**
376
+ * Disconnect all connected clients, and then dispose the room.
377
+ *
378
+ * @param closeCode WebSocket close code (default = 4000, which is a "consented leave")
379
+ * @returns Promise<void>
380
+ */
274
381
  disconnect(closeCode = Protocol.WS_CLOSE_CONSENTED) {
275
382
  if (this._internalState === 2 /* DISPOSING */) {
276
383
  return Promise.resolve(`disconnect() ignored: room (${this.roomId}) is already disposing.`);
@@ -370,6 +477,16 @@ class Room {
370
477
  ));
371
478
  }
372
479
  }
480
+ /**
481
+ * Allow the specified client to reconnect into the room. Must be used inside `onLeave()` method.
482
+ * If seconds is provided, the reconnection is going to be cancelled after the provided amount of seconds.
483
+ *
484
+ * @param previousClient - The client which is to be waiting until re-connection happens.
485
+ * @param seconds - Timeout period on re-connection in seconds.
486
+ *
487
+ * @returns Deferred<Client> - The differed is a promise like type.
488
+ * This type can forcibly reject the promise by calling `.reject()`.
489
+ */
373
490
  allowReconnection(previousClient, seconds) {
374
491
  if (previousClient._enqueuedMessages !== void 0) {
375
492
  return Deferred.reject("client not joined");