@colyseus/core 0.16.0-preview.8 → 0.16.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 (146) hide show
  1. package/README.md +5 -5
  2. package/build/Debug.js +6 -2
  3. package/build/Debug.js.map +2 -2
  4. package/build/Debug.mjs +11 -10
  5. package/build/Debug.mjs.map +2 -2
  6. package/build/IPC.d.ts +1 -1
  7. package/build/IPC.js +3 -3
  8. package/build/IPC.js.map +2 -2
  9. package/build/IPC.mjs +4 -3
  10. package/build/IPC.mjs.map +2 -2
  11. package/build/Logger.mjs +4 -3
  12. package/build/Logger.mjs.map +1 -1
  13. package/build/MatchMaker.d.ts +35 -30
  14. package/build/MatchMaker.js +150 -100
  15. package/build/MatchMaker.js.map +2 -2
  16. package/build/MatchMaker.mjs +154 -107
  17. package/build/MatchMaker.mjs.map +2 -2
  18. package/build/Protocol.d.ts +3 -4
  19. package/build/Protocol.js +33 -19
  20. package/build/Protocol.js.map +2 -2
  21. package/build/Protocol.mjs +36 -21
  22. package/build/Protocol.mjs.map +2 -2
  23. package/build/Room.d.ts +64 -40
  24. package/build/Room.js +412 -154
  25. package/build/Room.js.map +2 -2
  26. package/build/Room.mjs +416 -161
  27. package/build/Room.mjs.map +2 -2
  28. package/build/Server.d.ts +8 -7
  29. package/build/Server.js +51 -18
  30. package/build/Server.js.map +2 -2
  31. package/build/Server.mjs +51 -21
  32. package/build/Server.mjs.map +3 -3
  33. package/build/Stats.d.ts +2 -0
  34. package/build/Stats.js +38 -3
  35. package/build/Stats.js.map +2 -2
  36. package/build/Stats.mjs +30 -6
  37. package/build/Stats.mjs.map +2 -2
  38. package/build/Transport.d.ts +29 -11
  39. package/build/Transport.js +1 -1
  40. package/build/Transport.js.map +2 -2
  41. package/build/Transport.mjs +6 -5
  42. package/build/Transport.mjs.map +2 -2
  43. package/build/discovery/index.d.ts +1 -1
  44. package/build/discovery/index.js.map +2 -2
  45. package/build/discovery/index.mjs +3 -2
  46. package/build/discovery/index.mjs.map +2 -2
  47. package/build/errors/RoomExceptions.d.ts +39 -0
  48. package/build/errors/RoomExceptions.js +100 -0
  49. package/build/errors/RoomExceptions.js.map +7 -0
  50. package/build/errors/RoomExceptions.mjs +71 -0
  51. package/build/errors/RoomExceptions.mjs.map +7 -0
  52. package/build/errors/SeatReservationError.mjs +3 -2
  53. package/build/errors/SeatReservationError.mjs.map +1 -1
  54. package/build/errors/ServerError.js +1 -1
  55. package/build/errors/ServerError.js.map +1 -1
  56. package/build/errors/ServerError.mjs +5 -4
  57. package/build/errors/ServerError.mjs.map +2 -2
  58. package/build/index.d.ts +21 -19
  59. package/build/index.js +47 -20
  60. package/build/index.js.map +2 -2
  61. package/build/index.mjs +41 -19
  62. package/build/index.mjs.map +2 -2
  63. package/build/matchmaker/Lobby.d.ts +3 -3
  64. package/build/matchmaker/Lobby.js +6 -3
  65. package/build/matchmaker/Lobby.js.map +2 -2
  66. package/build/matchmaker/Lobby.mjs +4 -4
  67. package/build/matchmaker/Lobby.mjs.map +2 -2
  68. package/build/matchmaker/RegisteredHandler.d.ts +6 -7
  69. package/build/matchmaker/RegisteredHandler.js +7 -10
  70. package/build/matchmaker/RegisteredHandler.js.map +2 -2
  71. package/build/matchmaker/RegisteredHandler.mjs +11 -13
  72. package/build/matchmaker/RegisteredHandler.mjs.map +2 -2
  73. package/build/matchmaker/controller.d.ts +4 -5
  74. package/build/matchmaker/controller.js +22 -15
  75. package/build/matchmaker/controller.js.map +2 -2
  76. package/build/matchmaker/controller.mjs +19 -13
  77. package/build/matchmaker/controller.mjs.map +2 -2
  78. package/build/matchmaker/driver/api.d.ts +104 -0
  79. package/build/matchmaker/driver/api.js +29 -0
  80. package/build/matchmaker/driver/api.js.map +7 -0
  81. package/build/matchmaker/driver/api.mjs +7 -0
  82. package/build/matchmaker/driver/api.mjs.map +7 -0
  83. package/build/matchmaker/driver/index.d.ts +2 -2
  84. package/build/matchmaker/driver/index.js +2 -2
  85. package/build/matchmaker/driver/index.js.map +2 -2
  86. package/build/matchmaker/driver/index.mjs +5 -4
  87. package/build/matchmaker/driver/index.mjs.map +2 -2
  88. package/build/matchmaker/driver/local/LocalDriver.d.ts +13 -0
  89. package/build/matchmaker/driver/local/LocalDriver.js +65 -0
  90. package/build/matchmaker/driver/local/LocalDriver.js.map +7 -0
  91. package/build/matchmaker/driver/local/LocalDriver.mjs +43 -0
  92. package/build/matchmaker/driver/local/LocalDriver.mjs.map +7 -0
  93. package/build/matchmaker/driver/local/Query.d.ts +9 -0
  94. package/build/matchmaker/driver/local/Query.js +78 -0
  95. package/build/matchmaker/driver/local/Query.js.map +7 -0
  96. package/build/matchmaker/driver/local/Query.mjs +56 -0
  97. package/build/matchmaker/driver/local/Query.mjs.map +7 -0
  98. package/build/matchmaker/driver/local/RoomData.d.ts +19 -0
  99. package/build/matchmaker/driver/local/RoomData.js +79 -0
  100. package/build/matchmaker/driver/local/RoomData.js.map +7 -0
  101. package/build/matchmaker/driver/local/RoomData.mjs +57 -0
  102. package/build/matchmaker/driver/local/RoomData.mjs.map +7 -0
  103. package/build/presence/LocalPresence.d.ts +10 -6
  104. package/build/presence/LocalPresence.js +85 -24
  105. package/build/presence/LocalPresence.js.map +3 -3
  106. package/build/presence/LocalPresence.mjs +85 -27
  107. package/build/presence/LocalPresence.mjs.map +3 -3
  108. package/build/presence/Presence.d.ts +38 -2
  109. package/build/presence/Presence.js.map +1 -1
  110. package/build/rooms/LobbyRoom.d.ts +6 -6
  111. package/build/rooms/LobbyRoom.js +8 -3
  112. package/build/rooms/LobbyRoom.js.map +2 -2
  113. package/build/rooms/LobbyRoom.mjs +7 -5
  114. package/build/rooms/LobbyRoom.mjs.map +2 -2
  115. package/build/rooms/RelayRoom.d.ts +3 -3
  116. package/build/rooms/RelayRoom.js +3 -1
  117. package/build/rooms/RelayRoom.js.map +2 -2
  118. package/build/rooms/RelayRoom.mjs +10 -7
  119. package/build/rooms/RelayRoom.mjs.map +2 -2
  120. package/build/serializer/NoneSerializer.d.ts +2 -2
  121. package/build/serializer/NoneSerializer.js.map +1 -1
  122. package/build/serializer/NoneSerializer.mjs +3 -2
  123. package/build/serializer/NoneSerializer.mjs.map +2 -2
  124. package/build/serializer/SchemaSerializer.d.ts +16 -15
  125. package/build/serializer/SchemaSerializer.js +12 -10
  126. package/build/serializer/SchemaSerializer.js.map +2 -2
  127. package/build/serializer/SchemaSerializer.mjs +16 -13
  128. package/build/serializer/SchemaSerializer.mjs.map +2 -2
  129. package/build/serializer/SchemaSerializerDebug.d.ts +7 -0
  130. package/build/serializer/SchemaSerializerDebug.js +0 -0
  131. package/build/serializer/SchemaSerializerDebug.js.map +7 -0
  132. package/build/serializer/SchemaSerializerDebug.mjs +0 -0
  133. package/build/serializer/SchemaSerializerDebug.mjs.map +7 -0
  134. package/build/serializer/Serializer.d.ts +1 -2
  135. package/build/serializer/Serializer.js.map +1 -1
  136. package/build/utils/DevMode.d.ts +2 -2
  137. package/build/utils/DevMode.js +8 -4
  138. package/build/utils/DevMode.js.map +2 -2
  139. package/build/utils/DevMode.mjs +7 -6
  140. package/build/utils/DevMode.mjs.map +2 -2
  141. package/build/utils/Utils.d.ts +8 -3
  142. package/build/utils/Utils.js +41 -17
  143. package/build/utils/Utils.js.map +2 -2
  144. package/build/utils/Utils.mjs +40 -21
  145. package/build/utils/Utils.mjs.map +2 -2
  146. package/package.json +17 -6
package/build/Room.d.ts CHANGED
@@ -1,15 +1,11 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- /// <reference types="node" />
4
- import http, { IncomingMessage } from 'http';
5
- import { Schema } from '@colyseus/schema';
6
- import Clock from '@gamestdio/timer';
1
+ import Clock from '@colyseus/timer';
7
2
  import { EventEmitter } from 'events';
8
- import { Presence } from './presence/Presence';
9
- import { Serializer } from './serializer/Serializer';
10
- import { Deferred } from './utils/Utils';
11
- import { RoomListingData } from './matchmaker/driver';
12
- import { Client, ClientArray, ISendOptions } from './Transport';
3
+ import { Presence } from './presence/Presence.js';
4
+ import { Serializer } from './serializer/Serializer.js';
5
+ import { Deferred } from './utils/Utils.js';
6
+ import { RoomCache } from './matchmaker/driver/api.js';
7
+ import { AuthContext, Client, ClientPrivate, ClientArray, ISendOptions } from './Transport';
8
+ import { RoomException } from './errors/RoomExceptions.js';
13
9
  export declare const DEFAULT_SEAT_RESERVATION_TIME: number;
14
10
  export type SimulationCallback = (deltaTime: number) => void;
15
11
  export interface IBroadcastOptions extends ISendOptions {
@@ -20,6 +16,8 @@ export declare enum RoomInternalState {
20
16
  CREATED = 1,
21
17
  DISPOSING = 2
22
18
  }
19
+ export type ExtractUserData<T> = T extends ClientArray<infer U> ? U : never;
20
+ export type ExtractAuthData<T> = T extends ClientArray<infer _, infer U> ? U : never;
23
21
  /**
24
22
  * A Room class is meant to implement a game session, and/or serve as the communication channel
25
23
  * between a group of clients.
@@ -38,7 +36,7 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
38
36
  */
39
37
  get locked(): boolean;
40
38
  get metadata(): Metadata;
41
- listing: RoomListingData<Metadata>;
39
+ listing: RoomCache<Metadata>;
42
40
  /**
43
41
  * Timing events tied to the room instance.
44
42
  * Intervals and timeouts are cleared when the room is disposed.
@@ -50,6 +48,12 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
50
48
  * the room will be unlocked as soon as a client disconnects from it.
51
49
  */
52
50
  maxClients: number;
51
+ /**
52
+ * Automatically dispose the room when last client disconnects.
53
+ *
54
+ * @default true
55
+ */
56
+ autoDispose: boolean;
53
57
  /**
54
58
  * Frequency to send the room state to connected clients, in milliseconds.
55
59
  *
@@ -76,7 +80,7 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
76
80
  _events: EventEmitter<[never]>;
77
81
  protected seatReservationTime: number;
78
82
  protected reservedSeats: {
79
- [sessionId: string]: [any, any];
83
+ [sessionId: string]: [any, any, boolean?, boolean?];
80
84
  };
81
85
  protected reservedSeatTimeouts: {
82
86
  [sessionId: string]: NodeJS.Timeout;
@@ -89,20 +93,15 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
89
93
  private _serializer;
90
94
  private _afterNextPatchQueue;
91
95
  private _simulationInterval;
92
- private _patchInterval;
93
96
  private _internalState;
94
- private _locked;
95
97
  private _lockedExplicitly;
96
- private _maxClientsReached;
97
98
  private _autoDisposeTimeout;
98
99
  constructor();
99
100
  /**
100
- * Automatically dispose the room when last client disconnects.
101
- *
102
- * @default true
101
+ * This method is called by the MatchMaker before onCreate()
102
+ * @internal
103
103
  */
104
- get autoDispose(): boolean;
105
- set autoDispose(value: boolean);
104
+ protected __init(): void;
106
105
  /**
107
106
  * The name of the room you provided as first argument for `gameServer.define()`.
108
107
  *
@@ -135,11 +134,27 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
135
134
  onLeave?(client: Client<UserData, AuthData>, consented?: boolean): void | Promise<any>;
136
135
  onDispose?(): void | Promise<any>;
137
136
  /**
138
- * onAuth at the instance level will be deprecated in the future.
139
- * Please use "static onAuth(token, req) instead
137
+ * Define a custom exception handler.
138
+ * If defined, all lifecycle hooks will be wrapped by try/catch, and the exception will be forwarded to this method.
139
+ *
140
+ * These methods will be wrapped by try/catch:
141
+ * - `onMessage`
142
+ * - `onAuth` / `onJoin` / `onLeave` / `onCreate` / `onDispose`
143
+ * - `clock.setTimeout` / `clock.setInterval`
144
+ * - `setSimulationInterval`
145
+ *
146
+ * (Experimental: this feature is subject to change in the future - we're currently getting feedback to improve it)
140
147
  */
141
- onAuth(client: Client<UserData, AuthData>, options: any, request?: http.IncomingMessage): any | Promise<any>;
142
- static onAuth(token: string, req: IncomingMessage): Promise<unknown>;
148
+ onUncaughtException?(error: RoomException<this>, methodName: 'onCreate' | 'onAuth' | 'onJoin' | 'onLeave' | 'onDispose' | 'onMessage' | 'setSimulationInterval' | 'setInterval' | 'setTimeout'): void;
149
+ onAuth(client: Client<UserData, AuthData>, options: any, context: AuthContext): any | Promise<any>;
150
+ static onAuth(token: string, options: any, context: AuthContext): Promise<unknown>;
151
+ /**
152
+ * This method is called during graceful shutdown of the server process
153
+ * You may override this method to dispose the room in your own way.
154
+ *
155
+ * Once process reaches room count of 0, the room process will be terminated.
156
+ */
157
+ onBeforeShutdown(): void;
143
158
  /**
144
159
  * devMode: When `devMode` is enabled, `onCacheRoom` method is called during
145
160
  * graceful shutdown.
@@ -184,7 +199,13 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
184
199
  * @param delay - Interval delay on executing `onTickCallback` in milliseconds.
185
200
  */
186
201
  setSimulationInterval(onTickCallback?: SimulationCallback, delay?: number): void;
202
+ /**
203
+ * @deprecated Use `.patchRate=` instead.
204
+ */
187
205
  setPatchRate(milliseconds: number | null): void;
206
+ /**
207
+ * @deprecated Use `.state =` instead.
208
+ */
188
209
  setState(newState: State): void;
189
210
  setSerializer(serializer: Serializer<State>): void;
190
211
  setMetadata(meta: Partial<Metadata>): Promise<void>;
@@ -198,15 +219,17 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
198
219
  */
199
220
  unlock(): Promise<void>;
200
221
  send(client: Client, type: string | number, message: any, options?: ISendOptions): void;
201
- send(client: Client, message: Schema, options?: ISendOptions): void;
202
- broadcast(type: string | number, message?: any, options?: IBroadcastOptions): any;
203
- broadcast<T extends Schema>(message: T, options?: IBroadcastOptions): any;
222
+ broadcast(type: string | number, message?: any, options?: IBroadcastOptions): void;
223
+ /**
224
+ * Broadcast bytes (UInt8Arrays) to a particular room
225
+ */
226
+ broadcastBytes(type: string | number, message: Uint8Array, options: IBroadcastOptions): void;
204
227
  /**
205
228
  * Checks whether mutations have occurred in the state, and broadcast them to all connected clients.
206
229
  */
207
230
  broadcastPatch(): boolean;
208
231
  onMessage<T = any>(messageType: '*', callback: (client: Client<UserData, AuthData>, type: string | number, message: T) => void): any;
209
- onMessage<T = any>(messageType: string | number, callback: (client: Client<UserData, AuthData>, message: T) => void): any;
232
+ onMessage<T = any>(messageType: string | number, callback: (client: Client<UserData, AuthData>, message: T) => void, validate?: (message: unknown) => T): any;
210
233
  /**
211
234
  * Disconnect all connected clients, and then dispose the room.
212
235
  *
@@ -214,7 +237,7 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
214
237
  * @returns Promise<void>
215
238
  */
216
239
  disconnect(closeCode?: number): Promise<any>;
217
- ['_onJoin'](client: Client, req?: http.IncomingMessage): Promise<void>;
240
+ ['_onJoin'](client: Client & ClientPrivate, authContext: AuthContext): Promise<void>;
218
241
  /**
219
242
  * Allow the specified client to reconnect into the room. Must be used inside `onLeave()` method.
220
243
  * If seconds is provided, the reconnection is going to be cancelled after the provided amount of seconds.
@@ -228,14 +251,15 @@ export declare abstract class Room<State extends object = any, Metadata = any, U
228
251
  allowReconnection(previousClient: Client, seconds: number | "manual"): Deferred<Client>;
229
252
  protected resetAutoDisposeTimeout(timeoutInSeconds?: number): void;
230
253
  private broadcastMessageType;
231
- private sendFullState;
232
- private _dequeueAfterPatchMessages;
233
- private _reserveSeat;
234
- private _disposeIfEmpty;
235
- private _dispose;
236
- private _onMessage;
237
- private _forciblyCloseClient;
238
- private _onLeave;
239
- private _incrementClientCount;
240
- private _decrementClientCount;
254
+ protected sendFullState(client: Client): void;
255
+ protected _dequeueAfterPatchMessages(): void;
256
+ protected _reserveSeat(sessionId: string, joinOptions?: any, authData?: any, seconds?: number, allowReconnection?: boolean, devModeReconnection?: boolean): Promise<boolean>;
257
+ protected _disposeIfEmpty(): boolean;
258
+ protected _dispose(): Promise<any>;
259
+ protected _onMessage(client: Client & ClientPrivate, buffer: Buffer): void;
260
+ protected _forciblyCloseClient(client: Client & ClientPrivate, closeCode: number): void;
261
+ protected _onLeave(client: Client, code?: number): Promise<any>;
262
+ protected _onAfterLeave(client: Client): Promise<void>;
263
+ protected _incrementClientCount(): Promise<void>;
264
+ protected _decrementClientCount(): Promise<boolean>;
241
265
  }