@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/index.mjs CHANGED
@@ -1,19 +1,30 @@
1
- import Clock, { Delayed } from "@gamestdio/timer";
2
- import { Server } from "./Server";
3
- import { Room, RoomInternalState } from "./Room";
4
- import { Protocol, ErrorCode, getMessageBytes } from "./Protocol";
5
- import { RegisteredHandler } from "./matchmaker/RegisteredHandler";
6
- import { ServerError } from "./errors/ServerError";
7
- import * as matchMaker from "./MatchMaker";
8
- import { updateLobby, subscribeLobby } from "./matchmaker/Lobby";
9
- export * from "./matchmaker/driver";
10
- import { ClientState, ClientArray, Transport } from "./Transport";
11
- import {} from "./presence/Presence";
12
- import { LocalPresence } from "./presence/LocalPresence";
13
- import {} from "./serializer/Serializer";
14
- import { SchemaSerializer } from "./serializer/SchemaSerializer";
15
- import { generateId, Deferred, HttpServerMock, spliceOne, getBearerToken } from "./utils/Utils";
16
- import { isDevMode } from "./utils/DevMode";
1
+ // packages/core/src/index.ts
2
+ import Clock, { Delayed } from "@colyseus/timer";
3
+ import { Server } from "./Server.mjs";
4
+ import { Room, RoomInternalState } from "./Room.mjs";
5
+ import { Protocol, ErrorCode, getMessageBytes } from "./Protocol.mjs";
6
+ import { RegisteredHandler } from "./matchmaker/RegisteredHandler.mjs";
7
+ import { ServerError } from "./errors/ServerError.mjs";
8
+ import {
9
+ RoomException,
10
+ OnCreateException,
11
+ OnAuthException,
12
+ OnJoinException,
13
+ OnLeaveException,
14
+ OnDisposeException,
15
+ OnMessageException,
16
+ SimulationIntervalException,
17
+ TimedEventException
18
+ } from "./errors/RoomExceptions";
19
+ import * as matchMaker from "./MatchMaker.mjs";
20
+ import { updateLobby, subscribeLobby } from "./matchmaker/Lobby.mjs";
21
+ export * from "./matchmaker/driver/local/LocalDriver.mjs";
22
+ import { ClientState, ClientArray, Transport } from "./Transport.mjs";
23
+ import { LocalPresence } from "./presence/LocalPresence.mjs";
24
+ import { SchemaSerializer } from "./serializer/SchemaSerializer.mjs";
25
+ import { generateId, Deferred, HttpServerMock, spliceOne, getBearerToken } from "./utils/Utils.mjs";
26
+ import { isDevMode } from "./utils/DevMode.mjs";
27
+ import { subscribeIPC, requestFromIPC } from "./IPC.mjs";
17
28
  import {
18
29
  debugMatchMaking,
19
30
  debugMessage,
@@ -24,9 +35,9 @@ import {
24
35
  debugPresence,
25
36
  debugAndPrintError
26
37
  } from "./Debug";
27
- import { LobbyRoom } from "./rooms/LobbyRoom";
28
- import { RelayRoom } from "./rooms/RelayRoom";
29
- import { logger } from "./Logger";
38
+ import { LobbyRoom } from "./rooms/LobbyRoom.mjs";
39
+ import { RelayRoom } from "./rooms/RelayRoom.mjs";
40
+ import { logger } from "./Logger.mjs";
30
41
  export {
31
42
  ClientArray,
32
43
  ClientState,
@@ -37,14 +48,23 @@ export {
37
48
  HttpServerMock,
38
49
  LobbyRoom,
39
50
  LocalPresence,
51
+ OnAuthException,
52
+ OnCreateException,
53
+ OnDisposeException,
54
+ OnJoinException,
55
+ OnLeaveException,
56
+ OnMessageException,
40
57
  Protocol,
41
58
  RegisteredHandler,
42
59
  RelayRoom,
43
60
  Room,
61
+ RoomException,
44
62
  RoomInternalState,
45
63
  SchemaSerializer,
46
64
  Server,
47
65
  ServerError,
66
+ SimulationIntervalException,
67
+ TimedEventException,
48
68
  Transport,
49
69
  debugAndPrintError,
50
70
  debugConnection,
@@ -60,7 +80,9 @@ export {
60
80
  isDevMode,
61
81
  logger,
62
82
  matchMaker,
83
+ requestFromIPC,
63
84
  spliceOne,
85
+ subscribeIPC,
64
86
  subscribeLobby,
65
87
  updateLobby
66
88
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import Clock, { Delayed } from '@gamestdio/timer';\n\n// Core classes\nexport { Server, type ServerOptions } from './Server';\nexport { Room, RoomInternalState } from './Room';\nexport { Protocol, ErrorCode, getMessageBytes } from './Protocol';\nexport { RegisteredHandler } from './matchmaker/RegisteredHandler';\nexport { ServerError } from './errors/ServerError';\n\n// MatchMaker\nimport * as matchMaker from './MatchMaker';\nexport { matchMaker };\nexport { updateLobby, subscribeLobby } from './matchmaker/Lobby';\n\n// Driver\nexport * from './matchmaker/driver';\n\n// Transport\nexport { type Client, ClientState, ClientArray, Transport, type ISendOptions } from './Transport';\n\n// Presence\nexport { type Presence } from './presence/Presence';\nexport { LocalPresence } from './presence/LocalPresence';\n\n// Serializers\nexport { type Serializer } from './serializer/Serializer';\nexport { SchemaSerializer } from './serializer/SchemaSerializer';\n\n// Utilities\nexport { Clock, Delayed };\nexport { generateId, Deferred, HttpServerMock, spliceOne, getBearerToken } from './utils/Utils';\nexport { isDevMode } from './utils/DevMode';\n\n// Debug\nexport {\n debugMatchMaking,\n debugMessage,\n debugPatch,\n debugError,\n debugConnection,\n debugDriver,\n debugPresence,\n debugAndPrintError,\n} from './Debug';\n\n// Default rooms\nexport { LobbyRoom } from './rooms/LobbyRoom';\nexport { RelayRoom } from './rooms/RelayRoom';\n\n// Abstract logging support\nexport { logger } from './Logger'\n"],
5
- "mappings": "AAAA,OAAO,SAAS,eAAe;AAG/B,SAAS,cAAkC;AAC3C,SAAS,MAAM,yBAAyB;AACxC,SAAS,UAAU,WAAW,uBAAuB;AACrD,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAG5B,YAAY,gBAAgB;AAE5B,SAAS,aAAa,sBAAsB;AAG5C,cAAc;AAGd,SAAsB,aAAa,aAAa,iBAAoC;AAGpF,eAA8B;AAC9B,SAAS,qBAAqB;AAG9B,eAAgC;AAChC,SAAS,wBAAwB;AAIjC,SAAS,YAAY,UAAU,gBAAgB,WAAW,sBAAsB;AAChF,SAAS,iBAAiB;AAG1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAG1B,SAAS,cAAc;",
4
+ "sourcesContent": ["import Clock, { Delayed } from '@colyseus/timer';\n\n// Core classes\nexport { Server, type ServerOptions } from './Server.js';\nexport { Room, RoomInternalState } from './Room.js';\nexport { Protocol, ErrorCode, getMessageBytes } from './Protocol.js';\nexport { RegisteredHandler } from './matchmaker/RegisteredHandler.js';\nexport { ServerError } from './errors/ServerError.js';\n\nexport {\n RoomException,\n OnCreateException,\n OnAuthException,\n OnJoinException,\n OnLeaveException,\n OnDisposeException,\n OnMessageException,\n SimulationIntervalException,\n TimedEventException,\n} from './errors/RoomExceptions';\n\n// MatchMaker\nimport * as matchMaker from './MatchMaker.js';\nexport { matchMaker };\nexport { updateLobby, subscribeLobby } from './matchmaker/Lobby.js';\n\n// Driver\nexport * from './matchmaker/driver/local/LocalDriver.js';\n\n// Transport\nexport { type Client, type ClientPrivate, type AuthContext, ClientState, ClientArray, Transport, type ISendOptions } from './Transport.js';\n\n// Presence\nexport { type Presence } from './presence/Presence.js';\nexport { LocalPresence } from './presence/LocalPresence.js';\n\n// Serializers\nexport { type Serializer } from './serializer/Serializer.js';\nexport { SchemaSerializer } from './serializer/SchemaSerializer.js';\n// export { SchemaSerializerDebug } from './serializer/SchemaSerializerDebug.js';\n\n// Utilities\nexport { Clock, Delayed };\nexport { generateId, Deferred, HttpServerMock, spliceOne, getBearerToken } from './utils/Utils.js';\nexport { isDevMode } from './utils/DevMode.js';\n\n// IPC\nexport { subscribeIPC, requestFromIPC } from './IPC.js';\n\n// Debug\nexport {\n debugMatchMaking,\n debugMessage,\n debugPatch,\n debugError,\n debugConnection,\n debugDriver,\n debugPresence,\n debugAndPrintError,\n} from './Debug';\n\n// Default rooms\nexport { LobbyRoom } from './rooms/LobbyRoom.js';\nexport { RelayRoom } from './rooms/RelayRoom.js';\n\n// Abstract logging support\nexport { logger } from './Logger.js';\n"],
5
+ "mappings": ";AAAA,OAAO,SAAS,eAAe;AAG/B,SAAS,cAAkC;AAC3C,SAAS,MAAM,yBAAyB;AACxC,SAAS,UAAU,WAAW,uBAAuB;AACrD,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAE5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,YAAY,gBAAgB;AAE5B,SAAS,aAAa,sBAAsB;AAG5C,cAAc;AAGd,SAA4D,aAAa,aAAa,iBAAoC;AAI1H,SAAS,qBAAqB;AAI9B,SAAS,wBAAwB;AAKjC,SAAS,YAAY,UAAU,gBAAgB,WAAW,sBAAsB;AAChF,SAAS,iBAAiB;AAG1B,SAAS,cAAc,sBAAsB;AAG7C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAG1B,SAAS,cAAc;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- import type { Room } from '../Room';
2
- import { RoomListingData } from './driver/interfaces';
1
+ import type { Room } from '../Room.js';
2
+ import { IRoomCache } from './driver/api.js';
3
3
  export declare function updateLobby(room: Room, removed?: boolean): void;
4
- export declare function subscribeLobby(callback: (roomId: string, roomListing: RoomListingData) => void): Promise<() => any>;
4
+ export declare function subscribeLobby(callback: (roomId: string, roomListing: IRoomCache) => void): Promise<() => any>;
@@ -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
  ));
@@ -27,12 +31,11 @@ __export(Lobby_exports, {
27
31
  updateLobby: () => updateLobby
28
32
  });
29
33
  module.exports = __toCommonJS(Lobby_exports);
30
- var matchMaker = __toESM(require("../MatchMaker"));
34
+ var matchMaker = __toESM(require("../MatchMaker.js"));
31
35
  const LOBBY_CHANNEL = "$lobby";
32
36
  function updateLobby(room, removed = false) {
33
37
  const listing = room.listing;
34
- if (listing.unlisted)
35
- return;
38
+ if (listing.unlisted) return;
36
39
  if (removed) {
37
40
  matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},1`);
38
41
  } else if (!listing.private) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/matchmaker/Lobby.ts"],
4
- "sourcesContent": ["import * as matchMaker from '../MatchMaker';\n\nimport type { Room } from '../Room';\nimport { RoomListingData } from './driver/interfaces';\n\nconst LOBBY_CHANNEL = '$lobby';\n\n/*\n * TODO: refactor this on v0.16\n *\n * Some users might be relying on \"1\" = \"removed\" from the lobby due to this workaround: https://github.com/colyseus/colyseus/issues/617\n * Though, for consistency, we should invert as \"0\" = \"invisible\" and \"1\" = \"visible\".\n *\n * - rename \"removed\" to \"isVisible\" and swap the logic\n * - emit \"visibility-change\" with inverted value (isVisible)\n * - update \"subscribeLobby\" to check \"1\" as \"isVisible\" instead of \"removed\"\n */\n\nexport function updateLobby(room: Room, removed: boolean = false) {\n const listing = room.listing;\n\n if (listing.unlisted) return;\n\n if (removed) {\n matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},1`);\n } else if (!listing.private) {\n matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},0`);\n }\n}\n\nexport async function subscribeLobby(callback: (roomId: string, roomListing: RoomListingData) => void) {\n const cb = async (message) => {\n const [roomId, isRemove] = message.split(',');\n\n if (isRemove === '1') {\n callback(roomId, null);\n\n } else {\n const room = (await matchMaker.query({ roomId }))[0];\n callback(roomId, room);\n }\n };\n\n await matchMaker.presence.subscribe(LOBBY_CHANNEL, cb);\n\n return () => matchMaker.presence.unsubscribe(LOBBY_CHANNEL, cb);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA4B;AAK5B,MAAM,gBAAgB;AAaf,SAAS,YAAY,MAAY,UAAmB,OAAO;AAChE,QAAM,UAAU,KAAK;AAErB,MAAI,QAAQ;AAAU;AAEtB,MAAI,SAAS;AACX,eAAW,SAAS,QAAQ,eAAe,GAAG,QAAQ,UAAU;AAAA,EAClE,WAAW,CAAC,QAAQ,SAAS;AAC3B,eAAW,SAAS,QAAQ,eAAe,GAAG,QAAQ,UAAU;AAAA,EAClE;AACF;AAEA,eAAsB,eAAe,UAAkE;AACrG,QAAM,KAAK,OAAO,YAAY;AAC5B,UAAM,CAAC,QAAQ,QAAQ,IAAI,QAAQ,MAAM,GAAG;AAE5C,QAAI,aAAa,KAAK;AACpB,eAAS,QAAQ,IAAI;AAAA,IAEvB,OAAO;AACL,YAAM,QAAQ,MAAM,WAAW,MAAM,EAAE,OAAO,CAAC,GAAG;AAClD,eAAS,QAAQ,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,UAAU,eAAe,EAAE;AAErD,SAAO,MAAM,WAAW,SAAS,YAAY,eAAe,EAAE;AAChE;",
4
+ "sourcesContent": ["import * as matchMaker from '../MatchMaker.js';\n\nimport type { Room } from '../Room.js';\nimport { IRoomCache } from './driver/api.js';\n\nconst LOBBY_CHANNEL = '$lobby';\n\n/*\n * TODO: refactor this on v0.16\n *\n * Some users might be relying on \"1\" = \"removed\" from the lobby due to this workaround: https://github.com/colyseus/colyseus/issues/617\n * Though, for consistency, we should invert as \"0\" = \"invisible\" and \"1\" = \"visible\".\n *\n * - rename \"removed\" to \"isVisible\" and swap the logic\n * - emit \"visibility-change\" with inverted value (isVisible)\n * - update \"subscribeLobby\" to check \"1\" as \"isVisible\" instead of \"removed\"\n */\n\nexport function updateLobby(room: Room, removed: boolean = false) {\n const listing = room.listing;\n\n if (listing.unlisted) return;\n\n if (removed) {\n matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},1`);\n } else if (!listing.private) {\n matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},0`);\n }\n}\n\nexport async function subscribeLobby(callback: (roomId: string, roomListing: IRoomCache) => void) {\n const cb = async (message) => {\n const [roomId, isRemove] = message.split(',');\n\n if (isRemove === '1') {\n callback(roomId, null);\n\n } else {\n const room = (await matchMaker.query({ roomId }))[0];\n callback(roomId, room);\n }\n };\n\n await matchMaker.presence.subscribe(LOBBY_CHANNEL, cb);\n\n return () => matchMaker.presence.unsubscribe(LOBBY_CHANNEL, cb);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA4B;AAK5B,MAAM,gBAAgB;AAaf,SAAS,YAAY,MAAY,UAAmB,OAAO;AAChE,QAAM,UAAU,KAAK;AAErB,MAAI,QAAQ,SAAU;AAEtB,MAAI,SAAS;AACX,eAAW,SAAS,QAAQ,eAAe,GAAG,QAAQ,MAAM,IAAI;AAAA,EAClE,WAAW,CAAC,QAAQ,SAAS;AAC3B,eAAW,SAAS,QAAQ,eAAe,GAAG,QAAQ,MAAM,IAAI;AAAA,EAClE;AACF;AAEA,eAAsB,eAAe,UAA6D;AAChG,QAAM,KAAK,OAAO,YAAY;AAC5B,UAAM,CAAC,QAAQ,QAAQ,IAAI,QAAQ,MAAM,GAAG;AAE5C,QAAI,aAAa,KAAK;AACpB,eAAS,QAAQ,IAAI;AAAA,IAEvB,OAAO;AACL,YAAM,QAAQ,MAAM,WAAW,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;AACnD,eAAS,QAAQ,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,UAAU,eAAe,EAAE;AAErD,SAAO,MAAM,WAAW,SAAS,YAAY,eAAe,EAAE;AAChE;",
6
6
  "names": []
7
7
  }
@@ -1,9 +1,9 @@
1
- import * as matchMaker from "../MatchMaker";
2
- const LOBBY_CHANNEL = "$lobby";
1
+ // packages/core/src/matchmaker/Lobby.ts
2
+ import * as matchMaker from "../MatchMaker.mjs";
3
+ var LOBBY_CHANNEL = "$lobby";
3
4
  function updateLobby(room, removed = false) {
4
5
  const listing = room.listing;
5
- if (listing.unlisted)
6
- return;
6
+ if (listing.unlisted) return;
7
7
  if (removed) {
8
8
  matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},1`);
9
9
  } else if (!listing.private) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/matchmaker/Lobby.ts"],
4
- "sourcesContent": ["import * as matchMaker from '../MatchMaker';\n\nimport type { Room } from '../Room';\nimport { RoomListingData } from './driver/interfaces';\n\nconst LOBBY_CHANNEL = '$lobby';\n\n/*\n * TODO: refactor this on v0.16\n *\n * Some users might be relying on \"1\" = \"removed\" from the lobby due to this workaround: https://github.com/colyseus/colyseus/issues/617\n * Though, for consistency, we should invert as \"0\" = \"invisible\" and \"1\" = \"visible\".\n *\n * - rename \"removed\" to \"isVisible\" and swap the logic\n * - emit \"visibility-change\" with inverted value (isVisible)\n * - update \"subscribeLobby\" to check \"1\" as \"isVisible\" instead of \"removed\"\n */\n\nexport function updateLobby(room: Room, removed: boolean = false) {\n const listing = room.listing;\n\n if (listing.unlisted) return;\n\n if (removed) {\n matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},1`);\n } else if (!listing.private) {\n matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},0`);\n }\n}\n\nexport async function subscribeLobby(callback: (roomId: string, roomListing: RoomListingData) => void) {\n const cb = async (message) => {\n const [roomId, isRemove] = message.split(',');\n\n if (isRemove === '1') {\n callback(roomId, null);\n\n } else {\n const room = (await matchMaker.query({ roomId }))[0];\n callback(roomId, room);\n }\n };\n\n await matchMaker.presence.subscribe(LOBBY_CHANNEL, cb);\n\n return () => matchMaker.presence.unsubscribe(LOBBY_CHANNEL, cb);\n}\n"],
5
- "mappings": "AAAA,YAAY,gBAAgB;AAK5B,MAAM,gBAAgB;AAaf,SAAS,YAAY,MAAY,UAAmB,OAAO;AAChE,QAAM,UAAU,KAAK;AAErB,MAAI,QAAQ;AAAU;AAEtB,MAAI,SAAS;AACX,eAAW,SAAS,QAAQ,eAAe,GAAG,QAAQ,UAAU;AAAA,EAClE,WAAW,CAAC,QAAQ,SAAS;AAC3B,eAAW,SAAS,QAAQ,eAAe,GAAG,QAAQ,UAAU;AAAA,EAClE;AACF;AAEA,eAAsB,eAAe,UAAkE;AACrG,QAAM,KAAK,OAAO,YAAY;AAC5B,UAAM,CAAC,QAAQ,QAAQ,IAAI,QAAQ,MAAM,GAAG;AAE5C,QAAI,aAAa,KAAK;AACpB,eAAS,QAAQ,IAAI;AAAA,IAEvB,OAAO;AACL,YAAM,QAAQ,MAAM,WAAW,MAAM,EAAE,OAAO,CAAC,GAAG;AAClD,eAAS,QAAQ,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,UAAU,eAAe,EAAE;AAErD,SAAO,MAAM,WAAW,SAAS,YAAY,eAAe,EAAE;AAChE;",
4
+ "sourcesContent": ["import * as matchMaker from '../MatchMaker.js';\n\nimport type { Room } from '../Room.js';\nimport { IRoomCache } from './driver/api.js';\n\nconst LOBBY_CHANNEL = '$lobby';\n\n/*\n * TODO: refactor this on v0.16\n *\n * Some users might be relying on \"1\" = \"removed\" from the lobby due to this workaround: https://github.com/colyseus/colyseus/issues/617\n * Though, for consistency, we should invert as \"0\" = \"invisible\" and \"1\" = \"visible\".\n *\n * - rename \"removed\" to \"isVisible\" and swap the logic\n * - emit \"visibility-change\" with inverted value (isVisible)\n * - update \"subscribeLobby\" to check \"1\" as \"isVisible\" instead of \"removed\"\n */\n\nexport function updateLobby(room: Room, removed: boolean = false) {\n const listing = room.listing;\n\n if (listing.unlisted) return;\n\n if (removed) {\n matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},1`);\n } else if (!listing.private) {\n matchMaker.presence.publish(LOBBY_CHANNEL, `${listing.roomId},0`);\n }\n}\n\nexport async function subscribeLobby(callback: (roomId: string, roomListing: IRoomCache) => void) {\n const cb = async (message) => {\n const [roomId, isRemove] = message.split(',');\n\n if (isRemove === '1') {\n callback(roomId, null);\n\n } else {\n const room = (await matchMaker.query({ roomId }))[0];\n callback(roomId, room);\n }\n };\n\n await matchMaker.presence.subscribe(LOBBY_CHANNEL, cb);\n\n return () => matchMaker.presence.unsubscribe(LOBBY_CHANNEL, cb);\n}\n"],
5
+ "mappings": ";AAAA,YAAY,gBAAgB;AAK5B,IAAM,gBAAgB;AAaf,SAAS,YAAY,MAAY,UAAmB,OAAO;AAChE,QAAM,UAAU,KAAK;AAErB,MAAI,QAAQ,SAAU;AAEtB,MAAI,SAAS;AACX,IAAW,oBAAS,QAAQ,eAAe,GAAG,QAAQ,MAAM,IAAI;AAAA,EAClE,WAAW,CAAC,QAAQ,SAAS;AAC3B,IAAW,oBAAS,QAAQ,eAAe,GAAG,QAAQ,MAAM,IAAI;AAAA,EAClE;AACF;AAEA,eAAsB,eAAe,UAA6D;AAChG,QAAM,KAAK,OAAO,YAAY;AAC5B,UAAM,CAAC,QAAQ,QAAQ,IAAI,QAAQ,MAAM,GAAG;AAE5C,QAAI,aAAa,KAAK;AACpB,eAAS,QAAQ,IAAI;AAAA,IAEvB,OAAO;AACL,YAAM,QAAQ,MAAiB,iBAAM,EAAE,OAAO,CAAC,GAAG,CAAC;AACnD,eAAS,QAAQ,IAAI;AAAA,IACvB;AAAA,EACF;AAEA,QAAiB,oBAAS,UAAU,eAAe,EAAE;AAErD,SAAO,MAAiB,oBAAS,YAAY,eAAe,EAAE;AAChE;",
6
6
  "names": []
7
7
  }
@@ -1,18 +1,17 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  import { IncomingMessage } from 'http';
4
2
  import { EventEmitter } from 'events';
5
- import { RoomListingData, SortOptions } from './driver/interfaces';
6
- import { Room } from './../Room';
7
- import { Type } from '../utils/types';
8
- export declare const INVALID_OPTION_KEYS: Array<keyof RoomListingData>;
3
+ import { RoomCache, SortOptions } from './driver/api.js';
4
+ import { Room } from './../Room.js';
5
+ import { Type } from '../utils/types.js';
6
+ export declare const INVALID_OPTION_KEYS: Array<keyof RoomCache>;
9
7
  export type ValidateAuthTokenCallback = (token: string, request?: IncomingMessage) => Promise<any>;
10
8
  export declare class RegisteredHandler extends EventEmitter {
9
+ name: string;
11
10
  klass: Type<Room>;
12
11
  options: any;
13
12
  filterOptions: string[];
14
13
  sortOptions?: SortOptions;
15
- constructor(klass: Type<Room>, options: any);
14
+ constructor(name: string, klass: Type<Room>, options: any);
16
15
  enableRealtimeListing(): this;
17
16
  filterBy(options: string[]): this;
18
17
  sortBy(options: SortOptions): this;
@@ -22,32 +22,29 @@ __export(RegisteredHandler_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(RegisteredHandler_exports);
24
24
  var import_events = require("events");
25
- var import_Logger = require("../Logger");
26
- var import_Lobby = require("./Lobby");
27
- let ColyseusAuth = void 0;
28
- try {
29
- ColyseusAuth = require("@colyseus/auth");
30
- } catch (e) {
31
- }
25
+ var import_Logger = require("../Logger.js");
26
+ var import_Lobby = require("./Lobby.js");
32
27
  const INVALID_OPTION_KEYS = [
33
28
  "clients",
34
29
  "locked",
35
30
  "private",
31
+ // 'maxClients', - maxClients can be useful as filter options
36
32
  "metadata",
37
33
  "name",
38
34
  "processId",
39
35
  "roomId"
40
36
  ];
41
37
  class RegisteredHandler extends import_events.EventEmitter {
42
- constructor(klass, options) {
38
+ constructor(name, klass, options) {
43
39
  super();
40
+ this.name = name;
41
+ this.klass = klass;
42
+ this.options = options;
44
43
  this.filterOptions = [];
45
44
  if (typeof klass !== "function") {
46
45
  import_Logger.logger.debug("You are likely not importing your room class correctly.");
47
46
  throw new Error(`class is expected but ${typeof klass} was provided.`);
48
47
  }
49
- this.klass = klass;
50
- this.options = options;
51
48
  }
52
49
  enableRealtimeListing() {
53
50
  this.on("create", (room) => (0, import_Lobby.updateLobby)(room));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/matchmaker/RegisteredHandler.ts"],
4
- "sourcesContent": ["import { IncomingMessage } from 'http';\nimport { EventEmitter } from 'events';\nimport { logger } from '../Logger';\nimport { RoomListingData, SortOptions } from './driver/interfaces';\n\nimport { Room } from './../Room';\nimport { updateLobby } from './Lobby';\nimport { Type } from '../utils/types';\n\nlet ColyseusAuth: any = undefined;\ntry { ColyseusAuth = require('@colyseus/auth'); } catch (e) {}\n\nexport const INVALID_OPTION_KEYS: Array<keyof RoomListingData> = [\n 'clients',\n 'locked',\n 'private',\n // 'maxClients', - maxClients can be useful as filter options\n 'metadata',\n 'name',\n 'processId',\n 'roomId',\n];\n\nexport type ValidateAuthTokenCallback = (token: string, request?: IncomingMessage) => Promise<any>;\n\nexport class RegisteredHandler extends EventEmitter {\n public klass: Type<Room>;\n public options: any;\n\n public filterOptions: string[] = [];\n public sortOptions?: SortOptions;\n\n constructor(klass: Type<Room>, options: any) {\n super();\n\n if (typeof(klass) !== 'function') {\n logger.debug('You are likely not importing your room class correctly.');\n throw new Error(`class is expected but ${typeof(klass)} was provided.`);\n }\n\n this.klass = klass;\n this.options = options;\n }\n\n public enableRealtimeListing() {\n this.on('create', (room) => updateLobby(room));\n this.on('lock', (room) => updateLobby(room));\n this.on('unlock', (room) => updateLobby(room));\n this.on('join', (room) => updateLobby(room));\n this.on('leave', (room, _, willDispose) => {\n if (!willDispose) {\n updateLobby(room);\n }\n });\n this.on('dispose', (room) => updateLobby(room, false));\n this.on('visibility-change', (room, isVisible) => updateLobby(room, isVisible));\n\n return this;\n }\n\n public filterBy(options: string[]) {\n this.filterOptions = options;\n return this;\n }\n\n public sortBy(options: SortOptions) {\n this.sortOptions = options;\n return this;\n }\n\n public getFilterOptions(options: any) {\n return this.filterOptions.reduce((prev, curr, i, arr) => {\n const field = arr[i];\n if (options.hasOwnProperty(field)) {\n if (INVALID_OPTION_KEYS.indexOf(field as any) !== -1) {\n logger.warn(`option \"${field}\" has internal usage and is going to be ignored.`);\n\n } else {\n prev[field] = options[field];\n }\n }\n return prev;\n }, {});\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA6B;AAC7B,oBAAuB;AAIvB,mBAA4B;AAG5B,IAAI,eAAoB;AACxB,IAAI;AAAE,iBAAe,QAAQ,gBAAgB;AAAG,SAAS,GAAP;AAAW;AAEtD,MAAM,sBAAoD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,MAAM,0BAA0B,2BAAa;AAAA,EAOlD,YAAY,OAAmB,SAAc;AAC3C,UAAM;AAJR,SAAO,gBAA0B,CAAC;AAMhC,QAAI,OAAO,UAAW,YAAY;AAChC,2BAAO,MAAM,yDAAyD;AACtE,YAAM,IAAI,MAAM,yBAAyB,OAAO,qBAAsB;AAAA,IACxE;AAEA,SAAK,QAAQ;AACb,SAAK,UAAU;AAAA,EACjB;AAAA,EAEO,wBAAwB;AAC7B,SAAK,GAAG,UAAU,CAAC,aAAS,0BAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,aAAS,0BAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,UAAU,CAAC,aAAS,0BAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,aAAS,0BAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,SAAS,CAAC,MAAM,GAAG,gBAAgB;AACzC,UAAI,CAAC,aAAa;AAChB,sCAAY,IAAI;AAAA,MAClB;AAAA,IACF,CAAC;AACD,SAAK,GAAG,WAAW,CAAC,aAAS,0BAAY,MAAM,KAAK,CAAC;AACrD,SAAK,GAAG,qBAAqB,CAAC,MAAM,kBAAc,0BAAY,MAAM,SAAS,CAAC;AAE9E,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,SAAmB;AACjC,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,SAAsB;AAClC,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEO,iBAAiB,SAAc;AACpC,WAAO,KAAK,cAAc,OAAO,CAAC,MAAM,MAAM,GAAG,QAAQ;AACvD,YAAM,QAAQ,IAAI;AAClB,UAAI,QAAQ,eAAe,KAAK,GAAG;AACjC,YAAI,oBAAoB,QAAQ,KAAY,MAAM,IAAI;AACpD,+BAAO,KAAK,WAAW,uDAAuD;AAAA,QAEhF,OAAO;AACL,eAAK,SAAS,QAAQ;AAAA,QACxB;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;",
4
+ "sourcesContent": ["import { IncomingMessage } from 'http';\nimport { EventEmitter } from 'events';\nimport { logger } from '../Logger.js';\nimport { RoomCache, SortOptions } from './driver/api.js';\n\nimport { Room } from './../Room.js';\nimport { updateLobby } from './Lobby.js';\nimport { Type } from '../utils/types.js';\n\nexport const INVALID_OPTION_KEYS: Array<keyof RoomCache> = [\n 'clients',\n 'locked',\n 'private',\n // 'maxClients', - maxClients can be useful as filter options\n 'metadata',\n 'name',\n 'processId',\n 'roomId',\n];\n\nexport type ValidateAuthTokenCallback = (token: string, request?: IncomingMessage) => Promise<any>;\n\nexport class RegisteredHandler extends EventEmitter {\n public filterOptions: string[] = [];\n public sortOptions?: SortOptions;\n\n constructor(\n public name: string,\n public klass: Type<Room>,\n public options: any\n ) {\n super();\n\n if (typeof(klass) !== 'function') {\n logger.debug('You are likely not importing your room class correctly.');\n throw new Error(`class is expected but ${typeof(klass)} was provided.`);\n }\n }\n\n public enableRealtimeListing() {\n this.on('create', (room) => updateLobby(room));\n this.on('lock', (room) => updateLobby(room));\n this.on('unlock', (room) => updateLobby(room));\n this.on('join', (room) => updateLobby(room));\n this.on('leave', (room, _, willDispose) => {\n if (!willDispose) {\n updateLobby(room);\n }\n });\n this.on('dispose', (room) => updateLobby(room, false));\n this.on('visibility-change', (room, isVisible) => updateLobby(room, isVisible));\n\n return this;\n }\n\n public filterBy(options: string[]) {\n this.filterOptions = options;\n return this;\n }\n\n public sortBy(options: SortOptions) {\n this.sortOptions = options;\n return this;\n }\n\n public getFilterOptions(options: any) {\n return this.filterOptions.reduce((prev, curr, i, arr) => {\n const field = arr[i];\n if (options.hasOwnProperty(field)) {\n if (INVALID_OPTION_KEYS.indexOf(field as any) !== -1) {\n logger.warn(`option \"${field}\" has internal usage and is going to be ignored.`);\n\n } else {\n prev[field] = options[field];\n }\n }\n return prev;\n }, {});\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA6B;AAC7B,oBAAuB;AAIvB,mBAA4B;AAGrB,MAAM,sBAA8C;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,MAAM,0BAA0B,2BAAa;AAAA,EAIlD,YACS,MACA,OACA,SACP;AACA,UAAM;AAJC;AACA;AACA;AANT,SAAO,gBAA0B,CAAC;AAUhC,QAAI,OAAO,UAAW,YAAY;AAChC,2BAAO,MAAM,yDAAyD;AACtE,YAAM,IAAI,MAAM,yBAAyB,OAAO,KAAM,gBAAgB;AAAA,IACxE;AAAA,EACF;AAAA,EAEO,wBAAwB;AAC7B,SAAK,GAAG,UAAU,CAAC,aAAS,0BAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,aAAS,0BAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,UAAU,CAAC,aAAS,0BAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,aAAS,0BAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,SAAS,CAAC,MAAM,GAAG,gBAAgB;AACzC,UAAI,CAAC,aAAa;AAChB,sCAAY,IAAI;AAAA,MAClB;AAAA,IACF,CAAC;AACD,SAAK,GAAG,WAAW,CAAC,aAAS,0BAAY,MAAM,KAAK,CAAC;AACrD,SAAK,GAAG,qBAAqB,CAAC,MAAM,kBAAc,0BAAY,MAAM,SAAS,CAAC;AAE9E,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,SAAmB;AACjC,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,SAAsB;AAClC,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEO,iBAAiB,SAAc;AACpC,WAAO,KAAK,cAAc,OAAO,CAAC,MAAM,MAAM,GAAG,QAAQ;AACvD,YAAM,QAAQ,IAAI,CAAC;AACnB,UAAI,QAAQ,eAAe,KAAK,GAAG;AACjC,YAAI,oBAAoB,QAAQ,KAAY,MAAM,IAAI;AACpD,+BAAO,KAAK,WAAW,KAAK,kDAAkD;AAAA,QAEhF,OAAO;AACL,eAAK,KAAK,IAAI,QAAQ,KAAK;AAAA,QAC7B;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,30 +1,28 @@
1
+ // packages/core/src/matchmaker/RegisteredHandler.ts
1
2
  import { EventEmitter } from "events";
2
- import { logger } from "../Logger";
3
- import { updateLobby } from "./Lobby";
4
- let ColyseusAuth = void 0;
5
- try {
6
- ColyseusAuth = require("@colyseus/auth");
7
- } catch (e) {
8
- }
9
- const INVALID_OPTION_KEYS = [
3
+ import { logger } from "../Logger.mjs";
4
+ import { updateLobby } from "./Lobby.mjs";
5
+ var INVALID_OPTION_KEYS = [
10
6
  "clients",
11
7
  "locked",
12
8
  "private",
9
+ // 'maxClients', - maxClients can be useful as filter options
13
10
  "metadata",
14
11
  "name",
15
12
  "processId",
16
13
  "roomId"
17
14
  ];
18
- class RegisteredHandler extends EventEmitter {
19
- constructor(klass, options) {
15
+ var RegisteredHandler = class extends EventEmitter {
16
+ constructor(name, klass, options) {
20
17
  super();
18
+ this.name = name;
19
+ this.klass = klass;
20
+ this.options = options;
21
21
  this.filterOptions = [];
22
22
  if (typeof klass !== "function") {
23
23
  logger.debug("You are likely not importing your room class correctly.");
24
24
  throw new Error(`class is expected but ${typeof klass} was provided.`);
25
25
  }
26
- this.klass = klass;
27
- this.options = options;
28
26
  }
29
27
  enableRealtimeListing() {
30
28
  this.on("create", (room) => updateLobby(room));
@@ -61,7 +59,7 @@ class RegisteredHandler extends EventEmitter {
61
59
  return prev;
62
60
  }, {});
63
61
  }
64
- }
62
+ };
65
63
  export {
66
64
  INVALID_OPTION_KEYS,
67
65
  RegisteredHandler
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/matchmaker/RegisteredHandler.ts"],
4
- "sourcesContent": ["import { IncomingMessage } from 'http';\nimport { EventEmitter } from 'events';\nimport { logger } from '../Logger';\nimport { RoomListingData, SortOptions } from './driver/interfaces';\n\nimport { Room } from './../Room';\nimport { updateLobby } from './Lobby';\nimport { Type } from '../utils/types';\n\nlet ColyseusAuth: any = undefined;\ntry { ColyseusAuth = require('@colyseus/auth'); } catch (e) {}\n\nexport const INVALID_OPTION_KEYS: Array<keyof RoomListingData> = [\n 'clients',\n 'locked',\n 'private',\n // 'maxClients', - maxClients can be useful as filter options\n 'metadata',\n 'name',\n 'processId',\n 'roomId',\n];\n\nexport type ValidateAuthTokenCallback = (token: string, request?: IncomingMessage) => Promise<any>;\n\nexport class RegisteredHandler extends EventEmitter {\n public klass: Type<Room>;\n public options: any;\n\n public filterOptions: string[] = [];\n public sortOptions?: SortOptions;\n\n constructor(klass: Type<Room>, options: any) {\n super();\n\n if (typeof(klass) !== 'function') {\n logger.debug('You are likely not importing your room class correctly.');\n throw new Error(`class is expected but ${typeof(klass)} was provided.`);\n }\n\n this.klass = klass;\n this.options = options;\n }\n\n public enableRealtimeListing() {\n this.on('create', (room) => updateLobby(room));\n this.on('lock', (room) => updateLobby(room));\n this.on('unlock', (room) => updateLobby(room));\n this.on('join', (room) => updateLobby(room));\n this.on('leave', (room, _, willDispose) => {\n if (!willDispose) {\n updateLobby(room);\n }\n });\n this.on('dispose', (room) => updateLobby(room, false));\n this.on('visibility-change', (room, isVisible) => updateLobby(room, isVisible));\n\n return this;\n }\n\n public filterBy(options: string[]) {\n this.filterOptions = options;\n return this;\n }\n\n public sortBy(options: SortOptions) {\n this.sortOptions = options;\n return this;\n }\n\n public getFilterOptions(options: any) {\n return this.filterOptions.reduce((prev, curr, i, arr) => {\n const field = arr[i];\n if (options.hasOwnProperty(field)) {\n if (INVALID_OPTION_KEYS.indexOf(field as any) !== -1) {\n logger.warn(`option \"${field}\" has internal usage and is going to be ignored.`);\n\n } else {\n prev[field] = options[field];\n }\n }\n return prev;\n }, {});\n }\n}\n"],
5
- "mappings": "AACA,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AAIvB,SAAS,mBAAmB;AAG5B,IAAI,eAAoB;AACxB,IAAI;AAAE,iBAAe,QAAQ,gBAAgB;AAAG,SAAS,GAAP;AAAW;AAEtD,MAAM,sBAAoD;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,MAAM,0BAA0B,aAAa;AAAA,EAOlD,YAAY,OAAmB,SAAc;AAC3C,UAAM;AAJR,SAAO,gBAA0B,CAAC;AAMhC,QAAI,OAAO,UAAW,YAAY;AAChC,aAAO,MAAM,yDAAyD;AACtE,YAAM,IAAI,MAAM,yBAAyB,OAAO,qBAAsB;AAAA,IACxE;AAEA,SAAK,QAAQ;AACb,SAAK,UAAU;AAAA,EACjB;AAAA,EAEO,wBAAwB;AAC7B,SAAK,GAAG,UAAU,CAAC,SAAS,YAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,SAAS,YAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,UAAU,CAAC,SAAS,YAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,SAAS,YAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,SAAS,CAAC,MAAM,GAAG,gBAAgB;AACzC,UAAI,CAAC,aAAa;AAChB,oBAAY,IAAI;AAAA,MAClB;AAAA,IACF,CAAC;AACD,SAAK,GAAG,WAAW,CAAC,SAAS,YAAY,MAAM,KAAK,CAAC;AACrD,SAAK,GAAG,qBAAqB,CAAC,MAAM,cAAc,YAAY,MAAM,SAAS,CAAC;AAE9E,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,SAAmB;AACjC,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,SAAsB;AAClC,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEO,iBAAiB,SAAc;AACpC,WAAO,KAAK,cAAc,OAAO,CAAC,MAAM,MAAM,GAAG,QAAQ;AACvD,YAAM,QAAQ,IAAI;AAClB,UAAI,QAAQ,eAAe,KAAK,GAAG;AACjC,YAAI,oBAAoB,QAAQ,KAAY,MAAM,IAAI;AACpD,iBAAO,KAAK,WAAW,uDAAuD;AAAA,QAEhF,OAAO;AACL,eAAK,SAAS,QAAQ;AAAA,QACxB;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;",
4
+ "sourcesContent": ["import { IncomingMessage } from 'http';\nimport { EventEmitter } from 'events';\nimport { logger } from '../Logger.js';\nimport { RoomCache, SortOptions } from './driver/api.js';\n\nimport { Room } from './../Room.js';\nimport { updateLobby } from './Lobby.js';\nimport { Type } from '../utils/types.js';\n\nexport const INVALID_OPTION_KEYS: Array<keyof RoomCache> = [\n 'clients',\n 'locked',\n 'private',\n // 'maxClients', - maxClients can be useful as filter options\n 'metadata',\n 'name',\n 'processId',\n 'roomId',\n];\n\nexport type ValidateAuthTokenCallback = (token: string, request?: IncomingMessage) => Promise<any>;\n\nexport class RegisteredHandler extends EventEmitter {\n public filterOptions: string[] = [];\n public sortOptions?: SortOptions;\n\n constructor(\n public name: string,\n public klass: Type<Room>,\n public options: any\n ) {\n super();\n\n if (typeof(klass) !== 'function') {\n logger.debug('You are likely not importing your room class correctly.');\n throw new Error(`class is expected but ${typeof(klass)} was provided.`);\n }\n }\n\n public enableRealtimeListing() {\n this.on('create', (room) => updateLobby(room));\n this.on('lock', (room) => updateLobby(room));\n this.on('unlock', (room) => updateLobby(room));\n this.on('join', (room) => updateLobby(room));\n this.on('leave', (room, _, willDispose) => {\n if (!willDispose) {\n updateLobby(room);\n }\n });\n this.on('dispose', (room) => updateLobby(room, false));\n this.on('visibility-change', (room, isVisible) => updateLobby(room, isVisible));\n\n return this;\n }\n\n public filterBy(options: string[]) {\n this.filterOptions = options;\n return this;\n }\n\n public sortBy(options: SortOptions) {\n this.sortOptions = options;\n return this;\n }\n\n public getFilterOptions(options: any) {\n return this.filterOptions.reduce((prev, curr, i, arr) => {\n const field = arr[i];\n if (options.hasOwnProperty(field)) {\n if (INVALID_OPTION_KEYS.indexOf(field as any) !== -1) {\n logger.warn(`option \"${field}\" has internal usage and is going to be ignored.`);\n\n } else {\n prev[field] = options[field];\n }\n }\n return prev;\n }, {});\n }\n}\n"],
5
+ "mappings": ";AACA,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AAIvB,SAAS,mBAAmB;AAGrB,IAAM,sBAA8C;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAIlD,YACS,MACA,OACA,SACP;AACA,UAAM;AAJC;AACA;AACA;AANT,SAAO,gBAA0B,CAAC;AAUhC,QAAI,OAAO,UAAW,YAAY;AAChC,aAAO,MAAM,yDAAyD;AACtE,YAAM,IAAI,MAAM,yBAAyB,OAAO,KAAM,gBAAgB;AAAA,IACxE;AAAA,EACF;AAAA,EAEO,wBAAwB;AAC7B,SAAK,GAAG,UAAU,CAAC,SAAS,YAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,SAAS,YAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,UAAU,CAAC,SAAS,YAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,SAAS,YAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,SAAS,CAAC,MAAM,GAAG,gBAAgB;AACzC,UAAI,CAAC,aAAa;AAChB,oBAAY,IAAI;AAAA,MAClB;AAAA,IACF,CAAC;AACD,SAAK,GAAG,WAAW,CAAC,SAAS,YAAY,MAAM,KAAK,CAAC;AACrD,SAAK,GAAG,qBAAqB,CAAC,MAAM,cAAc,YAAY,MAAM,SAAS,CAAC;AAE9E,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,SAAmB;AACjC,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,SAAsB;AAClC,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEO,iBAAiB,SAAc;AACpC,WAAO,KAAK,cAAc,OAAO,CAAC,MAAM,MAAM,GAAG,QAAQ;AACvD,YAAM,QAAQ,IAAI,CAAC;AACnB,UAAI,QAAQ,eAAe,KAAK,GAAG;AACjC,YAAI,oBAAoB,QAAQ,KAAY,MAAM,IAAI;AACpD,iBAAO,KAAK,WAAW,KAAK,kDAAkD;AAAA,QAEhF,OAAO;AACL,eAAK,KAAK,IAAI,QAAQ,KAAK;AAAA,QAC7B;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;",
6
6
  "names": []
7
7
  }
@@ -2,9 +2,9 @@
2
2
  * Matchmaking controller
3
3
  * (for interoperability between different http frameworks, e.g. express, uWebSockets.js, etc)
4
4
  */
5
- /// <reference types="node" />
6
- import { IncomingMessage } from "http";
7
- import * as matchMaker from "../MatchMaker";
5
+ import { IncomingMessage } from 'http';
6
+ import * as matchMaker from '../MatchMaker.js';
7
+ import type { AuthContext } from '../Transport.js';
8
8
  declare const _default: {
9
9
  DEFAULT_CORS_HEADERS: {
10
10
  'Access-Control-Allow-Headers': string;
@@ -33,7 +33,6 @@ declare const _default: {
33
33
  getCorsHeaders(req: IncomingMessage): {
34
34
  [header: string]: string;
35
35
  };
36
- getAvailableRooms(roomName: string): Promise<import("./driver").RoomListingData<any>[]>;
37
- invokeMethod(method: string, roomName: string, clientOptions?: matchMaker.ClientOptions, authOptions?: matchMaker.AuthOptions): Promise<any>;
36
+ invokeMethod(method: string, roomName: string, clientOptions?: matchMaker.ClientOptions, authOptions?: AuthContext): Promise<any>;
38
37
  };
39
38
  export default _default;
@@ -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
  ));
@@ -26,9 +30,9 @@ __export(controller_exports, {
26
30
  default: () => controller_default
27
31
  });
28
32
  module.exports = __toCommonJS(controller_exports);
29
- var import_Protocol = require("../Protocol");
30
- var import_ServerError = require("../errors/ServerError");
31
- var matchMaker = __toESM(require("../MatchMaker"));
33
+ var import_Protocol = require("../Protocol.js");
34
+ var import_ServerError = require("../errors/ServerError.js");
35
+ var matchMaker = __toESM(require("../MatchMaker.js"));
32
36
  var controller_default = {
33
37
  DEFAULT_CORS_HEADERS: {
34
38
  "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept, Authorization",
@@ -36,26 +40,31 @@ var controller_default = {
36
40
  "Access-Control-Allow-Credentials": "true",
37
41
  "Access-Control-Allow-Origin": "*",
38
42
  "Access-Control-Max-Age": "2592000"
43
+ // ...
39
44
  },
40
45
  exposedMethods: ["joinOrCreate", "create", "join", "joinById", "reconnect"],
41
46
  allowedRoomNameChars: /([a-zA-Z_\-0-9]+)/gi,
42
47
  matchmakeRoute: "matchmake",
48
+ /**
49
+ * You can manually change the default corsHeaders by overwriting the `getCorsHeaders()` method:
50
+ * ```
51
+ * import { matchMaker } from "@colyseus/core";
52
+ * matchMaker.controller.getCorsHeaders = function(req) {
53
+ * if (req.headers.referer !== "xxx") {
54
+ * }
55
+ *
56
+ * return {
57
+ * 'Access-Control-Allow-Origin': 'safedomain.com',
58
+ * }
59
+ * }
60
+ * ```
61
+ */
43
62
  getCorsHeaders(req) {
44
63
  const origin = req.headers && req.headers["origin"] || req.getHeader && req.getHeader("origin");
45
64
  return {
46
65
  ["Access-Control-Allow-Origin"]: origin || "*"
47
66
  };
48
67
  },
49
- getAvailableRooms(roomName) {
50
- const conditions = {
51
- locked: false,
52
- private: false
53
- };
54
- if (roomName) {
55
- conditions["name"] = roomName;
56
- }
57
- return matchMaker.query(conditions);
58
- },
59
68
  async invokeMethod(method, roomName, clientOptions = {}, authOptions) {
60
69
  if (this.exposedMethods.indexOf(method) === -1) {
61
70
  throw new import_ServerError.ServerError(import_Protocol.ErrorCode.MATCHMAKE_NO_HANDLER, `invalid method "${method}"`);
@@ -67,5 +76,3 @@ var controller_default = {
67
76
  }
68
77
  }
69
78
  };
70
- // Annotate the CommonJS export names for ESM import in node:
71
- 0 && (module.exports = {});
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/matchmaker/controller.ts"],
4
- "sourcesContent": ["/**\n * Matchmaking controller\n * (for interoperability between different http frameworks, e.g. express, uWebSockets.js, etc)\n */\n\nimport { IncomingMessage } from \"http\";\nimport { ErrorCode } from \"../Protocol\";\nimport { ServerError } from \"../errors/ServerError\";\nimport * as matchMaker from \"../MatchMaker\";\n\nexport default {\n DEFAULT_CORS_HEADERS: {\n 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, Authorization',\n 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',\n 'Access-Control-Allow-Credentials': 'true',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Max-Age': '2592000',\n // ...\n },\n\n exposedMethods: ['joinOrCreate', 'create', 'join', 'joinById', 'reconnect'],\n allowedRoomNameChars: /([a-zA-Z_\\-0-9]+)/gi,\n matchmakeRoute: 'matchmake',\n\n /**\n * You can manually change the default corsHeaders by overwriting the `getCorsHeaders()` method:\n * ```\n * import { matchMaker } from \"@colyseus/core\";\n * matchMaker.controller.getCorsHeaders = function(req) {\n * if (req.headers.referer !== \"xxx\") {\n * }\n *\n * return {\n * 'Access-Control-Allow-Origin': 'safedomain.com',\n * }\n * }\n * ```\n */\n getCorsHeaders(req: IncomingMessage): { [header: string]: string } {\n const origin = (req.headers && req.headers['origin']) || (req as any).getHeader && (req as any).getHeader('origin');\n return {\n ['Access-Control-Allow-Origin']: origin || \"*\",\n };\n },\n\n getAvailableRooms(roomName: string) {\n /**\n * list public & unlocked rooms\n */\n const conditions: any = {\n locked: false,\n private: false,\n };\n if (roomName) {\n conditions[\"name\"] = roomName;\n }\n return matchMaker.query(conditions);\n },\n\n async invokeMethod(\n method: string,\n roomName: string,\n clientOptions: matchMaker.ClientOptions = {},\n authOptions?: matchMaker.AuthOptions,\n ) {\n if (this.exposedMethods.indexOf(method) === -1) {\n throw new ServerError(ErrorCode.MATCHMAKE_NO_HANDLER, `invalid method \"${method}\"`);\n }\n\n try {\n return await matchMaker[method](roomName, clientOptions, authOptions);\n\n } catch (e) {\n throw new ServerError(e.code || ErrorCode.MATCHMAKE_UNHANDLED, e.message);\n }\n }\n\n}\n\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,sBAA0B;AAC1B,yBAA4B;AAC5B,iBAA4B;AAE5B,IAAO,qBAAQ;AAAA,EACb,sBAAsB;AAAA,IACpB,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,IAChC,oCAAoC;AAAA,IACpC,+BAA+B;AAAA,IAC/B,0BAA0B;AAAA,EAE5B;AAAA,EAEA,gBAAgB,CAAC,gBAAgB,UAAU,QAAQ,YAAY,WAAW;AAAA,EAC1E,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAgBhB,eAAe,KAAoD;AACjE,UAAM,SAAU,IAAI,WAAW,IAAI,QAAQ,aAAe,IAAY,aAAc,IAAY,UAAU,QAAQ;AAClH,WAAO;AAAA,MACL,CAAC,gCAAgC,UAAU;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,kBAAkB,UAAkB;AAIlC,UAAM,aAAkB;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AACA,QAAI,UAAU;AACZ,iBAAW,UAAU;AAAA,IACvB;AACA,WAAO,WAAW,MAAM,UAAU;AAAA,EACpC;AAAA,EAEA,MAAM,aACJ,QACA,UACA,gBAA0C,CAAC,GAC3C,aACA;AACA,QAAI,KAAK,eAAe,QAAQ,MAAM,MAAM,IAAI;AAC9C,YAAM,IAAI,+BAAY,0BAAU,sBAAsB,mBAAmB,SAAS;AAAA,IACpF;AAEA,QAAI;AACF,aAAO,MAAM,WAAW,QAAQ,UAAU,eAAe,WAAW;AAAA,IAEtE,SAAS,GAAP;AACA,YAAM,IAAI,+BAAY,EAAE,QAAQ,0BAAU,qBAAqB,EAAE,OAAO;AAAA,IAC1E;AAAA,EACF;AAEF;",
4
+ "sourcesContent": ["/**\n * Matchmaking controller\n * (for interoperability between different http frameworks, e.g. express, uWebSockets.js, etc)\n */\n\nimport { IncomingMessage } from 'http';\nimport { ErrorCode } from '../Protocol.js';\nimport { ServerError } from '../errors/ServerError.js';\nimport * as matchMaker from '../MatchMaker.js';\nimport type { AuthContext } from '../Transport.js';\n\nexport default {\n DEFAULT_CORS_HEADERS: {\n 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, Authorization',\n 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',\n 'Access-Control-Allow-Credentials': 'true',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Max-Age': '2592000',\n // ...\n },\n\n exposedMethods: ['joinOrCreate', 'create', 'join', 'joinById', 'reconnect'],\n allowedRoomNameChars: /([a-zA-Z_\\-0-9]+)/gi,\n matchmakeRoute: 'matchmake',\n\n /**\n * You can manually change the default corsHeaders by overwriting the `getCorsHeaders()` method:\n * ```\n * import { matchMaker } from \"@colyseus/core\";\n * matchMaker.controller.getCorsHeaders = function(req) {\n * if (req.headers.referer !== \"xxx\") {\n * }\n *\n * return {\n * 'Access-Control-Allow-Origin': 'safedomain.com',\n * }\n * }\n * ```\n */\n getCorsHeaders(req: IncomingMessage): { [header: string]: string } {\n const origin = (req.headers && req.headers['origin']) || (req as any).getHeader && (req as any).getHeader('origin');\n return {\n ['Access-Control-Allow-Origin']: origin || \"*\",\n };\n },\n\n async invokeMethod(\n method: string,\n roomName: string,\n clientOptions: matchMaker.ClientOptions = {},\n authOptions?: AuthContext,\n ) {\n if (this.exposedMethods.indexOf(method) === -1) {\n throw new ServerError(ErrorCode.MATCHMAKE_NO_HANDLER, `invalid method \"${method}\"`);\n }\n\n try {\n return await matchMaker[method](roomName, clientOptions, authOptions);\n\n } catch (e) {\n throw new ServerError(e.code || ErrorCode.MATCHMAKE_UNHANDLED, e.message);\n }\n }\n\n}\n\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,sBAA0B;AAC1B,yBAA4B;AAC5B,iBAA4B;AAG5B,IAAO,qBAAQ;AAAA,EACb,sBAAsB;AAAA,IACpB,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,IAChC,oCAAoC;AAAA,IACpC,+BAA+B;AAAA,IAC/B,0BAA0B;AAAA;AAAA,EAE5B;AAAA,EAEA,gBAAgB,CAAC,gBAAgB,UAAU,QAAQ,YAAY,WAAW;AAAA,EAC1E,sBAAsB;AAAA,EACtB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBhB,eAAe,KAAoD;AACjE,UAAM,SAAU,IAAI,WAAW,IAAI,QAAQ,QAAQ,KAAO,IAAY,aAAc,IAAY,UAAU,QAAQ;AAClH,WAAO;AAAA,MACL,CAAC,6BAA6B,GAAG,UAAU;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,QACA,UACA,gBAA0C,CAAC,GAC3C,aACA;AACA,QAAI,KAAK,eAAe,QAAQ,MAAM,MAAM,IAAI;AAC9C,YAAM,IAAI,+BAAY,0BAAU,sBAAsB,mBAAmB,MAAM,GAAG;AAAA,IACpF;AAEA,QAAI;AACF,aAAO,MAAM,WAAW,MAAM,EAAE,UAAU,eAAe,WAAW;AAAA,IAEtE,SAAS,GAAG;AACV,YAAM,IAAI,+BAAY,EAAE,QAAQ,0BAAU,qBAAqB,EAAE,OAAO;AAAA,IAC1E;AAAA,EACF;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
- import { ErrorCode } from "../Protocol";
2
- import { ServerError } from "../errors/ServerError";
3
- import * as matchMaker from "../MatchMaker";
1
+ // packages/core/src/matchmaker/controller.ts
2
+ import { ErrorCode } from "../Protocol.mjs";
3
+ import { ServerError } from "../errors/ServerError.mjs";
4
+ import * as matchMaker from "../MatchMaker.mjs";
4
5
  var controller_default = {
5
6
  DEFAULT_CORS_HEADERS: {
6
7
  "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept, Authorization",
@@ -8,26 +9,31 @@ var controller_default = {
8
9
  "Access-Control-Allow-Credentials": "true",
9
10
  "Access-Control-Allow-Origin": "*",
10
11
  "Access-Control-Max-Age": "2592000"
12
+ // ...
11
13
  },
12
14
  exposedMethods: ["joinOrCreate", "create", "join", "joinById", "reconnect"],
13
15
  allowedRoomNameChars: /([a-zA-Z_\-0-9]+)/gi,
14
16
  matchmakeRoute: "matchmake",
17
+ /**
18
+ * You can manually change the default corsHeaders by overwriting the `getCorsHeaders()` method:
19
+ * ```
20
+ * import { matchMaker } from "@colyseus/core";
21
+ * matchMaker.controller.getCorsHeaders = function(req) {
22
+ * if (req.headers.referer !== "xxx") {
23
+ * }
24
+ *
25
+ * return {
26
+ * 'Access-Control-Allow-Origin': 'safedomain.com',
27
+ * }
28
+ * }
29
+ * ```
30
+ */
15
31
  getCorsHeaders(req) {
16
32
  const origin = req.headers && req.headers["origin"] || req.getHeader && req.getHeader("origin");
17
33
  return {
18
34
  ["Access-Control-Allow-Origin"]: origin || "*"
19
35
  };
20
36
  },
21
- getAvailableRooms(roomName) {
22
- const conditions = {
23
- locked: false,
24
- private: false
25
- };
26
- if (roomName) {
27
- conditions["name"] = roomName;
28
- }
29
- return matchMaker.query(conditions);
30
- },
31
37
  async invokeMethod(method, roomName, clientOptions = {}, authOptions) {
32
38
  if (this.exposedMethods.indexOf(method) === -1) {
33
39
  throw new ServerError(ErrorCode.MATCHMAKE_NO_HANDLER, `invalid method "${method}"`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/matchmaker/controller.ts"],
4
- "sourcesContent": ["/**\n * Matchmaking controller\n * (for interoperability between different http frameworks, e.g. express, uWebSockets.js, etc)\n */\n\nimport { IncomingMessage } from \"http\";\nimport { ErrorCode } from \"../Protocol\";\nimport { ServerError } from \"../errors/ServerError\";\nimport * as matchMaker from \"../MatchMaker\";\n\nexport default {\n DEFAULT_CORS_HEADERS: {\n 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, Authorization',\n 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',\n 'Access-Control-Allow-Credentials': 'true',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Max-Age': '2592000',\n // ...\n },\n\n exposedMethods: ['joinOrCreate', 'create', 'join', 'joinById', 'reconnect'],\n allowedRoomNameChars: /([a-zA-Z_\\-0-9]+)/gi,\n matchmakeRoute: 'matchmake',\n\n /**\n * You can manually change the default corsHeaders by overwriting the `getCorsHeaders()` method:\n * ```\n * import { matchMaker } from \"@colyseus/core\";\n * matchMaker.controller.getCorsHeaders = function(req) {\n * if (req.headers.referer !== \"xxx\") {\n * }\n *\n * return {\n * 'Access-Control-Allow-Origin': 'safedomain.com',\n * }\n * }\n * ```\n */\n getCorsHeaders(req: IncomingMessage): { [header: string]: string } {\n const origin = (req.headers && req.headers['origin']) || (req as any).getHeader && (req as any).getHeader('origin');\n return {\n ['Access-Control-Allow-Origin']: origin || \"*\",\n };\n },\n\n getAvailableRooms(roomName: string) {\n /**\n * list public & unlocked rooms\n */\n const conditions: any = {\n locked: false,\n private: false,\n };\n if (roomName) {\n conditions[\"name\"] = roomName;\n }\n return matchMaker.query(conditions);\n },\n\n async invokeMethod(\n method: string,\n roomName: string,\n clientOptions: matchMaker.ClientOptions = {},\n authOptions?: matchMaker.AuthOptions,\n ) {\n if (this.exposedMethods.indexOf(method) === -1) {\n throw new ServerError(ErrorCode.MATCHMAKE_NO_HANDLER, `invalid method \"${method}\"`);\n }\n\n try {\n return await matchMaker[method](roomName, clientOptions, authOptions);\n\n } catch (e) {\n throw new ServerError(e.code || ErrorCode.MATCHMAKE_UNHANDLED, e.message);\n }\n }\n\n}\n\n"],
5
- "mappings": "AAMA,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAC5B,YAAY,gBAAgB;AAE5B,IAAO,qBAAQ;AAAA,EACb,sBAAsB;AAAA,IACpB,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,IAChC,oCAAoC;AAAA,IACpC,+BAA+B;AAAA,IAC/B,0BAA0B;AAAA,EAE5B;AAAA,EAEA,gBAAgB,CAAC,gBAAgB,UAAU,QAAQ,YAAY,WAAW;AAAA,EAC1E,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAgBhB,eAAe,KAAoD;AACjE,UAAM,SAAU,IAAI,WAAW,IAAI,QAAQ,aAAe,IAAY,aAAc,IAAY,UAAU,QAAQ;AAClH,WAAO;AAAA,MACL,CAAC,gCAAgC,UAAU;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,kBAAkB,UAAkB;AAIlC,UAAM,aAAkB;AAAA,MACtB,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AACA,QAAI,UAAU;AACZ,iBAAW,UAAU;AAAA,IACvB;AACA,WAAO,WAAW,MAAM,UAAU;AAAA,EACpC;AAAA,EAEA,MAAM,aACJ,QACA,UACA,gBAA0C,CAAC,GAC3C,aACA;AACA,QAAI,KAAK,eAAe,QAAQ,MAAM,MAAM,IAAI;AAC9C,YAAM,IAAI,YAAY,UAAU,sBAAsB,mBAAmB,SAAS;AAAA,IACpF;AAEA,QAAI;AACF,aAAO,MAAM,WAAW,QAAQ,UAAU,eAAe,WAAW;AAAA,IAEtE,SAAS,GAAP;AACA,YAAM,IAAI,YAAY,EAAE,QAAQ,UAAU,qBAAqB,EAAE,OAAO;AAAA,IAC1E;AAAA,EACF;AAEF;",
4
+ "sourcesContent": ["/**\n * Matchmaking controller\n * (for interoperability between different http frameworks, e.g. express, uWebSockets.js, etc)\n */\n\nimport { IncomingMessage } from 'http';\nimport { ErrorCode } from '../Protocol.js';\nimport { ServerError } from '../errors/ServerError.js';\nimport * as matchMaker from '../MatchMaker.js';\nimport type { AuthContext } from '../Transport.js';\n\nexport default {\n DEFAULT_CORS_HEADERS: {\n 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, Authorization',\n 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',\n 'Access-Control-Allow-Credentials': 'true',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Max-Age': '2592000',\n // ...\n },\n\n exposedMethods: ['joinOrCreate', 'create', 'join', 'joinById', 'reconnect'],\n allowedRoomNameChars: /([a-zA-Z_\\-0-9]+)/gi,\n matchmakeRoute: 'matchmake',\n\n /**\n * You can manually change the default corsHeaders by overwriting the `getCorsHeaders()` method:\n * ```\n * import { matchMaker } from \"@colyseus/core\";\n * matchMaker.controller.getCorsHeaders = function(req) {\n * if (req.headers.referer !== \"xxx\") {\n * }\n *\n * return {\n * 'Access-Control-Allow-Origin': 'safedomain.com',\n * }\n * }\n * ```\n */\n getCorsHeaders(req: IncomingMessage): { [header: string]: string } {\n const origin = (req.headers && req.headers['origin']) || (req as any).getHeader && (req as any).getHeader('origin');\n return {\n ['Access-Control-Allow-Origin']: origin || \"*\",\n };\n },\n\n async invokeMethod(\n method: string,\n roomName: string,\n clientOptions: matchMaker.ClientOptions = {},\n authOptions?: AuthContext,\n ) {\n if (this.exposedMethods.indexOf(method) === -1) {\n throw new ServerError(ErrorCode.MATCHMAKE_NO_HANDLER, `invalid method \"${method}\"`);\n }\n\n try {\n return await matchMaker[method](roomName, clientOptions, authOptions);\n\n } catch (e) {\n throw new ServerError(e.code || ErrorCode.MATCHMAKE_UNHANDLED, e.message);\n }\n }\n\n}\n\n"],
5
+ "mappings": ";AAMA,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAC5B,YAAY,gBAAgB;AAG5B,IAAO,qBAAQ;AAAA,EACb,sBAAsB;AAAA,IACpB,gCAAgC;AAAA,IAChC,gCAAgC;AAAA,IAChC,oCAAoC;AAAA,IACpC,+BAA+B;AAAA,IAC/B,0BAA0B;AAAA;AAAA,EAE5B;AAAA,EAEA,gBAAgB,CAAC,gBAAgB,UAAU,QAAQ,YAAY,WAAW;AAAA,EAC1E,sBAAsB;AAAA,EACtB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBhB,eAAe,KAAoD;AACjE,UAAM,SAAU,IAAI,WAAW,IAAI,QAAQ,QAAQ,KAAO,IAAY,aAAc,IAAY,UAAU,QAAQ;AAClH,WAAO;AAAA,MACL,CAAC,6BAA6B,GAAG,UAAU;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,QACA,UACA,gBAA0C,CAAC,GAC3C,aACA;AACA,QAAI,KAAK,eAAe,QAAQ,MAAM,MAAM,IAAI;AAC9C,YAAM,IAAI,YAAY,UAAU,sBAAsB,mBAAmB,MAAM,GAAG;AAAA,IACpF;AAEA,QAAI;AACF,aAAO,MAAM,WAAW,MAAM,EAAE,UAAU,eAAe,WAAW;AAAA,IAEtE,SAAS,GAAG;AACV,YAAM,IAAI,YAAY,EAAE,QAAQ,UAAU,qBAAqB,EAAE,OAAO;AAAA,IAC1E;AAAA,EACF;AAEF;",
6
6
  "names": []
7
7
  }