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