@colyseus/core 0.16.24 → 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 +49 -108
- package/build/Server.js.map +3 -3
- package/build/Server.mjs +40 -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/utils/DevMode.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;
|
|
@@ -28,44 +29,63 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
28
29
|
var DevMode_exports = {};
|
|
29
30
|
__export(DevMode_exports, {
|
|
30
31
|
cacheRoomHistory: () => cacheRoomHistory,
|
|
31
|
-
|
|
32
|
+
getDevModeCache: () => getDevModeCache,
|
|
32
33
|
getPreviousProcessId: () => getPreviousProcessId,
|
|
33
34
|
getProcessRestoreKey: () => getProcessRestoreKey,
|
|
34
35
|
getRoomRestoreListKey: () => getRoomRestoreListKey,
|
|
36
|
+
hasDevModeCache: () => hasDevModeCache,
|
|
35
37
|
isDevMode: () => isDevMode,
|
|
36
38
|
reloadFromCache: () => reloadFromCache,
|
|
37
|
-
setDevMode: () => setDevMode
|
|
39
|
+
setDevMode: () => setDevMode,
|
|
40
|
+
writeDevModeCache: () => writeDevModeCache
|
|
38
41
|
});
|
|
39
42
|
module.exports = __toCommonJS(DevMode_exports);
|
|
40
|
-
var
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
var
|
|
44
|
-
|
|
43
|
+
var import_fs = __toESM(require("fs"), 1);
|
|
44
|
+
var import_path = __toESM(require("path"), 1);
|
|
45
|
+
var import_schema = require("@colyseus/schema");
|
|
46
|
+
var import_Logger = require("../Logger.ts");
|
|
47
|
+
var import_Debug = require("../Debug.ts");
|
|
48
|
+
var import_MatchMaker = require("../MatchMaker.ts");
|
|
49
|
+
const DEVMODE_CACHE_FILE_PATH = import_path.default.resolve(".devmode.json");
|
|
45
50
|
let isDevMode = false;
|
|
51
|
+
function hasDevModeCache() {
|
|
52
|
+
return import_fs.default.existsSync(DEVMODE_CACHE_FILE_PATH);
|
|
53
|
+
}
|
|
54
|
+
function getDevModeCache() {
|
|
55
|
+
return JSON.parse(import_fs.default.readFileSync(DEVMODE_CACHE_FILE_PATH, "utf8")) || {};
|
|
56
|
+
}
|
|
57
|
+
function writeDevModeCache(cache) {
|
|
58
|
+
import_fs.default.writeFileSync(DEVMODE_CACHE_FILE_PATH, JSON.stringify(cache, null, 2), "utf8");
|
|
59
|
+
}
|
|
46
60
|
function setDevMode(bool) {
|
|
47
61
|
isDevMode = bool;
|
|
48
62
|
}
|
|
49
63
|
async function reloadFromCache() {
|
|
50
64
|
const roomHistoryList = Object.entries(await import_MatchMaker.presence.hgetall(getRoomRestoreListKey()));
|
|
51
|
-
debugDevMode("rooms to restore: %i", roomHistoryList.length);
|
|
65
|
+
(0, import_Debug.debugDevMode)("rooms to restore: %i", roomHistoryList.length);
|
|
52
66
|
for (const [roomId, value] of roomHistoryList) {
|
|
53
67
|
const roomHistory = JSON.parse(value);
|
|
54
|
-
debugDevMode("restoring room %s (%s)", roomHistory.roomName, roomId);
|
|
68
|
+
(0, import_Debug.debugDevMode)("restoring room %s (%s)", roomHistory.roomName, roomId);
|
|
55
69
|
const recreatedRoomListing = await (0, import_MatchMaker.handleCreateRoom)(roomHistory.roomName, roomHistory.clientOptions, roomId);
|
|
56
70
|
const recreatedRoom = (0, import_MatchMaker.getLocalRoomById)(recreatedRoomListing.roomId);
|
|
57
|
-
import_Logger.logger.debug(`\u{1F504} room '${roomId}' has been restored.`);
|
|
58
71
|
if (roomHistory.hasOwnProperty("state")) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
72
|
+
try {
|
|
73
|
+
const rawState = JSON.parse(roomHistory.state);
|
|
74
|
+
import_Logger.logger.debug(`\u{1F4CB} room '${roomId}' state =>`, rawState);
|
|
75
|
+
recreatedRoom.state.restore(rawState);
|
|
76
|
+
} catch (e) {
|
|
77
|
+
(0, import_Debug.debugAndPrintError)(`\u274C couldn't restore room '${roomId}' state:
|
|
78
|
+
${e.stack}`);
|
|
79
|
+
}
|
|
62
80
|
}
|
|
63
|
-
recreatedRoom.onRestoreRoom?.(roomHistory["cache"]);
|
|
64
81
|
if (roomHistory.clients) {
|
|
65
|
-
for (const
|
|
66
|
-
|
|
82
|
+
for (const clientData of roomHistory.clients) {
|
|
83
|
+
const { sessionId, reconnectionToken } = clientData;
|
|
84
|
+
await (0, import_MatchMaker.remoteRoomCall)(recreatedRoomListing.roomId, "_reserveSeat", [sessionId, {}, {}, 20, false, reconnectionToken]);
|
|
67
85
|
}
|
|
68
86
|
}
|
|
87
|
+
recreatedRoom.onRestoreRoom?.(roomHistory["cache"]);
|
|
88
|
+
import_Logger.logger.debug(`\u{1F504} room '${roomId}' has been restored with ${roomHistory.clients?.length || 0} reserved seats: ${roomHistory.clients?.map((c) => c.sessionId).join(", ")}`);
|
|
69
89
|
}
|
|
70
90
|
if (roomHistoryList.length > 0) {
|
|
71
91
|
import_Logger.logger.debug("\u2705", roomHistoryList.length, "room(s) have been restored.");
|
|
@@ -78,16 +98,22 @@ async function cacheRoomHistory(rooms) {
|
|
|
78
98
|
try {
|
|
79
99
|
const roomHistory = JSON.parse(roomHistoryResult);
|
|
80
100
|
roomHistory["cache"] = room.onCacheRoom?.();
|
|
81
|
-
debugDevMode("caching room %s (%s)", room.roomName, room.roomId);
|
|
101
|
+
(0, import_Debug.debugDevMode)("caching room %s (%s)", room.roomName, room.roomId);
|
|
82
102
|
if (room.state) {
|
|
83
|
-
roomHistory["state"] = room.state
|
|
84
|
-
}
|
|
85
|
-
roomHistory["clients"] = room.clients.map((client) => client.sessionId);
|
|
86
|
-
for (const sessionId in room["reservedSeats"]) {
|
|
87
|
-
roomHistory["clients"].push(sessionId);
|
|
103
|
+
roomHistory["state"] = JSON.stringify(room.state);
|
|
88
104
|
}
|
|
105
|
+
const activeClients = room.clients.map((client) => ({
|
|
106
|
+
sessionId: client.sessionId,
|
|
107
|
+
reconnectionToken: client.reconnectionToken
|
|
108
|
+
}));
|
|
109
|
+
const activeSessionIds = new Set(activeClients.map((c) => c.sessionId));
|
|
110
|
+
const reservedSeats = Object.keys(room["_reservedSeats"]).filter((sessionId) => !activeSessionIds.has(sessionId)).map((sessionId) => ({
|
|
111
|
+
sessionId,
|
|
112
|
+
reconnectionToken: void 0
|
|
113
|
+
}));
|
|
114
|
+
roomHistory["clients"] = activeClients.concat(reservedSeats);
|
|
89
115
|
await import_MatchMaker.presence.hset(getRoomRestoreListKey(), room.roomId, JSON.stringify(roomHistory));
|
|
90
|
-
import_Logger.logger.debug(`\u{1F4BE} caching room '${room.roomId}' (clients: ${room.clients.length}, state
|
|
116
|
+
import_Logger.logger.debug(`\u{1F4BE} caching room '${room.roomId}' (clients: ${room.clients.length}, has state: ${roomHistory["state"] !== void 0 ? "yes" : "no"})`);
|
|
91
117
|
} catch (e) {
|
|
92
118
|
(0, import_Debug.debugAndPrintError)(`\u274C couldn't cache room '${room.roomId}', due to:
|
|
93
119
|
${e.stack}`);
|
|
@@ -95,7 +121,7 @@ ${e.stack}`);
|
|
|
95
121
|
}
|
|
96
122
|
}
|
|
97
123
|
}
|
|
98
|
-
async function getPreviousProcessId(hostname) {
|
|
124
|
+
async function getPreviousProcessId(hostname = "") {
|
|
99
125
|
return await import_MatchMaker.presence.hget(getProcessRestoreKey(), hostname);
|
|
100
126
|
}
|
|
101
127
|
function getRoomRestoreListKey() {
|
|
@@ -107,11 +133,13 @@ function getProcessRestoreKey() {
|
|
|
107
133
|
// Annotate the CommonJS export names for ESM import in node:
|
|
108
134
|
0 && (module.exports = {
|
|
109
135
|
cacheRoomHistory,
|
|
110
|
-
|
|
136
|
+
getDevModeCache,
|
|
111
137
|
getPreviousProcessId,
|
|
112
138
|
getProcessRestoreKey,
|
|
113
139
|
getRoomRestoreListKey,
|
|
140
|
+
hasDevModeCache,
|
|
114
141
|
isDevMode,
|
|
115
142
|
reloadFromCache,
|
|
116
|
-
setDevMode
|
|
143
|
+
setDevMode,
|
|
144
|
+
writeDevModeCache
|
|
117
145
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/DevMode.ts"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport { type Schema, MapSchema, ArraySchema, SetSchema, CollectionSchema, $childType } from '@colyseus/schema';\nimport { logger } from '../Logger.ts';\nimport { debugAndPrintError, debugDevMode } from '../Debug.ts';\nimport { getLocalRoomById, handleCreateRoom, presence, remoteRoomCall } from '../MatchMaker.ts';\nimport type { Room } from '../Room.ts';\n\nconst DEVMODE_CACHE_FILE_PATH = path.resolve(\".devmode.json\");\n\nexport let isDevMode: boolean = false;\n\nexport function hasDevModeCache() {\n return fs.existsSync(DEVMODE_CACHE_FILE_PATH);\n}\n\nexport function getDevModeCache() {\n return JSON.parse(fs.readFileSync(DEVMODE_CACHE_FILE_PATH, 'utf8')) || {};\n}\n\nexport function writeDevModeCache(cache: any) {\n fs.writeFileSync(DEVMODE_CACHE_FILE_PATH, JSON.stringify(cache, null, 2), 'utf8');\n}\n\nexport function setDevMode(bool: boolean) {\n isDevMode = bool;\n}\n\nexport async function reloadFromCache() {\n const roomHistoryList = Object.entries(await presence.hgetall(getRoomRestoreListKey()));\n debugDevMode(\"rooms to restore: %i\", roomHistoryList.length);\n\n for (const [roomId, value] of roomHistoryList) {\n const roomHistory = JSON.parse(value);\n debugDevMode(\"restoring room %s (%s)\", roomHistory.roomName, roomId);\n\n const recreatedRoomListing = await handleCreateRoom(roomHistory.roomName, roomHistory.clientOptions, roomId);\n const recreatedRoom = getLocalRoomById(recreatedRoomListing.roomId);\n\n // Restore previous state\n if (roomHistory.hasOwnProperty(\"state\")) {\n try {\n const rawState = JSON.parse(roomHistory.state);\n logger.debug(`\uD83D\uDCCB room '${roomId}' state =>`, rawState);\n\n (recreatedRoom.state as Schema).restore(rawState);\n } catch (e: any) {\n debugAndPrintError(`\u274C couldn't restore room '${roomId}' state:\\n${e.stack}`);\n }\n }\n\n // Reserve seats for clients from cached history\n if (roomHistory.clients) {\n for (const clientData of roomHistory.clients) {\n // TODO: need to restore each client's StateView as well\n // reserve seat for 20 seconds\n const { sessionId, reconnectionToken } = clientData;\n await remoteRoomCall(recreatedRoomListing.roomId, '_reserveSeat', [sessionId, {}, {}, 20, false, reconnectionToken]);\n }\n }\n\n // call `onRestoreRoom` with custom 'cache'd property.\n recreatedRoom.onRestoreRoom?.(roomHistory[\"cache\"]);\n\n logger.debug(`\uD83D\uDD04 room '${roomId}' has been restored with ${roomHistory.clients?.length || 0} reserved seats: ${roomHistory.clients?.map((c: any) => c.sessionId).join(\", \")}`);\n }\n\n if (roomHistoryList.length > 0) {\n logger.debug(\"\u2705\", roomHistoryList.length, \"room(s) have been restored.\");\n }\n}\n\nexport async function cacheRoomHistory(rooms: { [roomId: string]: Room }) {\n for (const room of Object.values(rooms)) {\n const roomHistoryResult = await presence.hget(getRoomRestoreListKey(), room.roomId);\n if (roomHistoryResult) {\n try {\n const roomHistory = JSON.parse(roomHistoryResult);\n\n // custom cache method\n roomHistory[\"cache\"] = room.onCacheRoom?.();\n\n // encode state\n debugDevMode(\"caching room %s (%s)\", room.roomName, room.roomId);\n\n if (room.state) {\n roomHistory[\"state\"] = JSON.stringify(room.state);\n }\n\n // cache active clients with their reconnection tokens\n // TODO: need to cache each client's StateView as well\n const activeClients = room.clients.map((client) => ({\n sessionId: client.sessionId,\n reconnectionToken: client.reconnectionToken,\n }));\n\n // collect active client sessionIds to avoid duplicates\n const activeSessionIds = new Set(activeClients.map((c) => c.sessionId));\n\n // also cache reserved seats (they don't have reconnectionTokens yet)\n // filter out reserved seats that are already active clients (from devMode reconnection)\n const reservedSeats = Object.keys(room['_reservedSeats'])\n .filter((sessionId) => !activeSessionIds.has(sessionId))\n .map((sessionId) => ({\n sessionId,\n reconnectionToken: undefined,\n }));\n\n roomHistory[\"clients\"] = activeClients.concat(reservedSeats);\n\n await presence.hset(getRoomRestoreListKey(), room.roomId, JSON.stringify(roomHistory));\n\n // Rewrite updated room history\n logger.debug(`\uD83D\uDCBE caching room '${room.roomId}' (clients: ${room.clients.length}, has state: ${roomHistory[\"state\"] !== undefined ? \"yes\" : \"no\"})`);\n\n } catch (e: any) {\n debugAndPrintError(`\u274C couldn't cache room '${room.roomId}', due to:\\n${e.stack}`);\n }\n }\n }\n}\n\nexport async function getPreviousProcessId(hostname: string = '') {\n return await presence.hget(getProcessRestoreKey(), hostname);\n}\n\nexport function getRoomRestoreListKey() {\n return 'roomhistory';\n}\n\nexport function getProcessRestoreKey() {\n return 'processhistory';\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "fs"]
|
|
7
7
|
}
|
package/build/utils/DevMode.mjs
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
// packages/core/src/utils/DevMode.ts
|
|
2
|
-
import
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import "@colyseus/schema";
|
|
3
5
|
import { logger } from "../Logger.mjs";
|
|
4
|
-
import { debugAndPrintError } from "../Debug.mjs";
|
|
6
|
+
import { debugAndPrintError, debugDevMode } from "../Debug.mjs";
|
|
5
7
|
import { getLocalRoomById, handleCreateRoom, presence, remoteRoomCall } from "../MatchMaker.mjs";
|
|
6
|
-
var
|
|
8
|
+
var DEVMODE_CACHE_FILE_PATH = path.resolve(".devmode.json");
|
|
7
9
|
var isDevMode = false;
|
|
10
|
+
function hasDevModeCache() {
|
|
11
|
+
return fs.existsSync(DEVMODE_CACHE_FILE_PATH);
|
|
12
|
+
}
|
|
13
|
+
function getDevModeCache() {
|
|
14
|
+
return JSON.parse(fs.readFileSync(DEVMODE_CACHE_FILE_PATH, "utf8")) || {};
|
|
15
|
+
}
|
|
16
|
+
function writeDevModeCache(cache) {
|
|
17
|
+
fs.writeFileSync(DEVMODE_CACHE_FILE_PATH, JSON.stringify(cache, null, 2), "utf8");
|
|
18
|
+
}
|
|
8
19
|
function setDevMode(bool) {
|
|
9
20
|
isDevMode = bool;
|
|
10
21
|
}
|
|
@@ -16,18 +27,24 @@ async function reloadFromCache() {
|
|
|
16
27
|
debugDevMode("restoring room %s (%s)", roomHistory.roomName, roomId);
|
|
17
28
|
const recreatedRoomListing = await handleCreateRoom(roomHistory.roomName, roomHistory.clientOptions, roomId);
|
|
18
29
|
const recreatedRoom = getLocalRoomById(recreatedRoomListing.roomId);
|
|
19
|
-
logger.debug(`\u{1F504} room '${roomId}' has been restored.`);
|
|
20
30
|
if (roomHistory.hasOwnProperty("state")) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
31
|
+
try {
|
|
32
|
+
const rawState = JSON.parse(roomHistory.state);
|
|
33
|
+
logger.debug(`\u{1F4CB} room '${roomId}' state =>`, rawState);
|
|
34
|
+
recreatedRoom.state.restore(rawState);
|
|
35
|
+
} catch (e) {
|
|
36
|
+
debugAndPrintError(`\u274C couldn't restore room '${roomId}' state:
|
|
37
|
+
${e.stack}`);
|
|
38
|
+
}
|
|
24
39
|
}
|
|
25
|
-
recreatedRoom.onRestoreRoom?.(roomHistory["cache"]);
|
|
26
40
|
if (roomHistory.clients) {
|
|
27
|
-
for (const
|
|
28
|
-
|
|
41
|
+
for (const clientData of roomHistory.clients) {
|
|
42
|
+
const { sessionId, reconnectionToken } = clientData;
|
|
43
|
+
await remoteRoomCall(recreatedRoomListing.roomId, "_reserveSeat", [sessionId, {}, {}, 20, false, reconnectionToken]);
|
|
29
44
|
}
|
|
30
45
|
}
|
|
46
|
+
recreatedRoom.onRestoreRoom?.(roomHistory["cache"]);
|
|
47
|
+
logger.debug(`\u{1F504} room '${roomId}' has been restored with ${roomHistory.clients?.length || 0} reserved seats: ${roomHistory.clients?.map((c) => c.sessionId).join(", ")}`);
|
|
31
48
|
}
|
|
32
49
|
if (roomHistoryList.length > 0) {
|
|
33
50
|
logger.debug("\u2705", roomHistoryList.length, "room(s) have been restored.");
|
|
@@ -42,14 +59,20 @@ async function cacheRoomHistory(rooms) {
|
|
|
42
59
|
roomHistory["cache"] = room.onCacheRoom?.();
|
|
43
60
|
debugDevMode("caching room %s (%s)", room.roomName, room.roomId);
|
|
44
61
|
if (room.state) {
|
|
45
|
-
roomHistory["state"] = room.state
|
|
46
|
-
}
|
|
47
|
-
roomHistory["clients"] = room.clients.map((client) => client.sessionId);
|
|
48
|
-
for (const sessionId in room["reservedSeats"]) {
|
|
49
|
-
roomHistory["clients"].push(sessionId);
|
|
62
|
+
roomHistory["state"] = JSON.stringify(room.state);
|
|
50
63
|
}
|
|
64
|
+
const activeClients = room.clients.map((client) => ({
|
|
65
|
+
sessionId: client.sessionId,
|
|
66
|
+
reconnectionToken: client.reconnectionToken
|
|
67
|
+
}));
|
|
68
|
+
const activeSessionIds = new Set(activeClients.map((c) => c.sessionId));
|
|
69
|
+
const reservedSeats = Object.keys(room["_reservedSeats"]).filter((sessionId) => !activeSessionIds.has(sessionId)).map((sessionId) => ({
|
|
70
|
+
sessionId,
|
|
71
|
+
reconnectionToken: void 0
|
|
72
|
+
}));
|
|
73
|
+
roomHistory["clients"] = activeClients.concat(reservedSeats);
|
|
51
74
|
await presence.hset(getRoomRestoreListKey(), room.roomId, JSON.stringify(roomHistory));
|
|
52
|
-
logger.debug(`\u{1F4BE} caching room '${room.roomId}' (clients: ${room.clients.length}, state
|
|
75
|
+
logger.debug(`\u{1F4BE} caching room '${room.roomId}' (clients: ${room.clients.length}, has state: ${roomHistory["state"] !== void 0 ? "yes" : "no"})`);
|
|
53
76
|
} catch (e) {
|
|
54
77
|
debugAndPrintError(`\u274C couldn't cache room '${room.roomId}', due to:
|
|
55
78
|
${e.stack}`);
|
|
@@ -57,7 +80,7 @@ ${e.stack}`);
|
|
|
57
80
|
}
|
|
58
81
|
}
|
|
59
82
|
}
|
|
60
|
-
async function getPreviousProcessId(hostname) {
|
|
83
|
+
async function getPreviousProcessId(hostname = "") {
|
|
61
84
|
return await presence.hget(getProcessRestoreKey(), hostname);
|
|
62
85
|
}
|
|
63
86
|
function getRoomRestoreListKey() {
|
|
@@ -68,11 +91,13 @@ function getProcessRestoreKey() {
|
|
|
68
91
|
}
|
|
69
92
|
export {
|
|
70
93
|
cacheRoomHistory,
|
|
71
|
-
|
|
94
|
+
getDevModeCache,
|
|
72
95
|
getPreviousProcessId,
|
|
73
96
|
getProcessRestoreKey,
|
|
74
97
|
getRoomRestoreListKey,
|
|
98
|
+
hasDevModeCache,
|
|
75
99
|
isDevMode,
|
|
76
100
|
reloadFromCache,
|
|
77
|
-
setDevMode
|
|
101
|
+
setDevMode,
|
|
102
|
+
writeDevModeCache
|
|
78
103
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/DevMode.ts"],
|
|
4
|
-
"sourcesContent": ["import
|
|
5
|
-
"mappings": ";AAAA,OAAO,
|
|
4
|
+
"sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport { type Schema, MapSchema, ArraySchema, SetSchema, CollectionSchema, $childType } from '@colyseus/schema';\nimport { logger } from '../Logger.ts';\nimport { debugAndPrintError, debugDevMode } from '../Debug.ts';\nimport { getLocalRoomById, handleCreateRoom, presence, remoteRoomCall } from '../MatchMaker.ts';\nimport type { Room } from '../Room.ts';\n\nconst DEVMODE_CACHE_FILE_PATH = path.resolve(\".devmode.json\");\n\nexport let isDevMode: boolean = false;\n\nexport function hasDevModeCache() {\n return fs.existsSync(DEVMODE_CACHE_FILE_PATH);\n}\n\nexport function getDevModeCache() {\n return JSON.parse(fs.readFileSync(DEVMODE_CACHE_FILE_PATH, 'utf8')) || {};\n}\n\nexport function writeDevModeCache(cache: any) {\n fs.writeFileSync(DEVMODE_CACHE_FILE_PATH, JSON.stringify(cache, null, 2), 'utf8');\n}\n\nexport function setDevMode(bool: boolean) {\n isDevMode = bool;\n}\n\nexport async function reloadFromCache() {\n const roomHistoryList = Object.entries(await presence.hgetall(getRoomRestoreListKey()));\n debugDevMode(\"rooms to restore: %i\", roomHistoryList.length);\n\n for (const [roomId, value] of roomHistoryList) {\n const roomHistory = JSON.parse(value);\n debugDevMode(\"restoring room %s (%s)\", roomHistory.roomName, roomId);\n\n const recreatedRoomListing = await handleCreateRoom(roomHistory.roomName, roomHistory.clientOptions, roomId);\n const recreatedRoom = getLocalRoomById(recreatedRoomListing.roomId);\n\n // Restore previous state\n if (roomHistory.hasOwnProperty(\"state\")) {\n try {\n const rawState = JSON.parse(roomHistory.state);\n logger.debug(`\uD83D\uDCCB room '${roomId}' state =>`, rawState);\n\n (recreatedRoom.state as Schema).restore(rawState);\n } catch (e: any) {\n debugAndPrintError(`\u274C couldn't restore room '${roomId}' state:\\n${e.stack}`);\n }\n }\n\n // Reserve seats for clients from cached history\n if (roomHistory.clients) {\n for (const clientData of roomHistory.clients) {\n // TODO: need to restore each client's StateView as well\n // reserve seat for 20 seconds\n const { sessionId, reconnectionToken } = clientData;\n await remoteRoomCall(recreatedRoomListing.roomId, '_reserveSeat', [sessionId, {}, {}, 20, false, reconnectionToken]);\n }\n }\n\n // call `onRestoreRoom` with custom 'cache'd property.\n recreatedRoom.onRestoreRoom?.(roomHistory[\"cache\"]);\n\n logger.debug(`\uD83D\uDD04 room '${roomId}' has been restored with ${roomHistory.clients?.length || 0} reserved seats: ${roomHistory.clients?.map((c: any) => c.sessionId).join(\", \")}`);\n }\n\n if (roomHistoryList.length > 0) {\n logger.debug(\"\u2705\", roomHistoryList.length, \"room(s) have been restored.\");\n }\n}\n\nexport async function cacheRoomHistory(rooms: { [roomId: string]: Room }) {\n for (const room of Object.values(rooms)) {\n const roomHistoryResult = await presence.hget(getRoomRestoreListKey(), room.roomId);\n if (roomHistoryResult) {\n try {\n const roomHistory = JSON.parse(roomHistoryResult);\n\n // custom cache method\n roomHistory[\"cache\"] = room.onCacheRoom?.();\n\n // encode state\n debugDevMode(\"caching room %s (%s)\", room.roomName, room.roomId);\n\n if (room.state) {\n roomHistory[\"state\"] = JSON.stringify(room.state);\n }\n\n // cache active clients with their reconnection tokens\n // TODO: need to cache each client's StateView as well\n const activeClients = room.clients.map((client) => ({\n sessionId: client.sessionId,\n reconnectionToken: client.reconnectionToken,\n }));\n\n // collect active client sessionIds to avoid duplicates\n const activeSessionIds = new Set(activeClients.map((c) => c.sessionId));\n\n // also cache reserved seats (they don't have reconnectionTokens yet)\n // filter out reserved seats that are already active clients (from devMode reconnection)\n const reservedSeats = Object.keys(room['_reservedSeats'])\n .filter((sessionId) => !activeSessionIds.has(sessionId))\n .map((sessionId) => ({\n sessionId,\n reconnectionToken: undefined,\n }));\n\n roomHistory[\"clients\"] = activeClients.concat(reservedSeats);\n\n await presence.hset(getRoomRestoreListKey(), room.roomId, JSON.stringify(roomHistory));\n\n // Rewrite updated room history\n logger.debug(`\uD83D\uDCBE caching room '${room.roomId}' (clients: ${room.clients.length}, has state: ${roomHistory[\"state\"] !== undefined ? \"yes\" : \"no\"})`);\n\n } catch (e: any) {\n debugAndPrintError(`\u274C couldn't cache room '${room.roomId}', due to:\\n${e.stack}`);\n }\n }\n }\n}\n\nexport async function getPreviousProcessId(hostname: string = '') {\n return await presence.hget(getProcessRestoreKey(), hostname);\n}\n\nexport function getRoomRestoreListKey() {\n return 'roomhistory';\n}\n\nexport function getProcessRestoreKey() {\n return 'processhistory';\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/StandardSchema.ts"],
|
|
4
|
-
"sourcesContent": ["import { StandardSchemaV1 } from '@standard-schema/spec';\nexport type { StandardSchemaV1 };\n\nexport function standardValidate<T extends StandardSchemaV1>(\n schema: T,\n input: StandardSchemaV1.InferInput<T>\n): StandardSchemaV1.InferOutput<T> {\n let result = schema['~standard'].validate(input);\n\n if (result instanceof Promise) {\n throw new Error('Schema validation must be synchronous');\n }\n\n // if the `issues` field exists, the validation failed\n if (result.issues) {\n throw new Error(JSON.stringify(result.issues, null, 2));\n }\n\n return (result as StandardSchemaV1.SuccessResult<StandardSchemaV1.InferOutput<T>>).value;\n}"],
|
|
4
|
+
"sourcesContent": ["import type { StandardSchemaV1 } from '@standard-schema/spec';\nexport type { StandardSchemaV1 };\n\nexport function standardValidate<T extends StandardSchemaV1>(\n schema: T,\n input: StandardSchemaV1.InferInput<T>\n): StandardSchemaV1.InferOutput<T> {\n let result = schema['~standard'].validate(input);\n\n if (result instanceof Promise) {\n throw new Error('Schema validation must be synchronous');\n }\n\n // if the `issues` field exists, the validation failed\n if (result.issues) {\n throw new Error(JSON.stringify(result.issues, null, 2));\n }\n\n return (result as StandardSchemaV1.SuccessResult<StandardSchemaV1.InferOutput<T>>).value;\n}"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,SAAS,iBACZ,QACA,OAC+B;AAC/B,MAAI,SAAS,OAAO,WAAW,EAAE,SAAS,KAAK;AAE/C,MAAI,kBAAkB,SAAS;AAC3B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EAC3D;AAGA,MAAI,OAAO,QAAQ;AACf,UAAM,IAAI,MAAM,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC1D;AAEA,SAAQ,OAA2E;AACvF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/StandardSchema.ts"],
|
|
4
|
-
"sourcesContent": ["import { StandardSchemaV1 } from '@standard-schema/spec';\nexport type { StandardSchemaV1 };\n\nexport function standardValidate<T extends StandardSchemaV1>(\n schema: T,\n input: StandardSchemaV1.InferInput<T>\n): StandardSchemaV1.InferOutput<T> {\n let result = schema['~standard'].validate(input);\n\n if (result instanceof Promise) {\n throw new Error('Schema validation must be synchronous');\n }\n\n // if the `issues` field exists, the validation failed\n if (result.issues) {\n throw new Error(JSON.stringify(result.issues, null, 2));\n }\n\n return (result as StandardSchemaV1.SuccessResult<StandardSchemaV1.InferOutput<T>>).value;\n}"],
|
|
4
|
+
"sourcesContent": ["import type { StandardSchemaV1 } from '@standard-schema/spec';\nexport type { StandardSchemaV1 };\n\nexport function standardValidate<T extends StandardSchemaV1>(\n schema: T,\n input: StandardSchemaV1.InferInput<T>\n): StandardSchemaV1.InferOutput<T> {\n let result = schema['~standard'].validate(input);\n\n if (result instanceof Promise) {\n throw new Error('Schema validation must be synchronous');\n }\n\n // if the `issues` field exists, the validation failed\n if (result.issues) {\n throw new Error(JSON.stringify(result.issues, null, 2));\n }\n\n return (result as StandardSchemaV1.SuccessResult<StandardSchemaV1.InferOutput<T>>).value;\n}"],
|
|
5
5
|
"mappings": ";AAGO,SAAS,iBACZ,QACA,OAC+B;AAC/B,MAAI,SAAS,OAAO,WAAW,EAAE,SAAS,KAAK;AAE/C,MAAI,kBAAkB,SAAS;AAC3B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EAC3D;AAGA,MAAI,OAAO,QAAQ;AACf,UAAM,IAAI,MAAM,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC1D;AAEA,SAAQ,OAA2E;AACvF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/utils/Utils.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
6
|
var __export = (target, all) => {
|
|
8
7
|
for (var name in all)
|
|
@@ -16,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
15
|
}
|
|
17
16
|
return to;
|
|
18
17
|
};
|
|
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.
|
|
24
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
-
mod
|
|
26
|
-
));
|
|
27
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
19
|
var Utils_exports = {};
|
|
29
20
|
__export(Utils_exports, {
|
|
@@ -40,13 +31,14 @@ __export(Utils_exports, {
|
|
|
40
31
|
wrapTryCatch: () => wrapTryCatch
|
|
41
32
|
});
|
|
42
33
|
module.exports = __toCommonJS(Utils_exports);
|
|
43
|
-
var import_nanoid =
|
|
34
|
+
var import_nanoid = require("nanoid");
|
|
44
35
|
var import_events = require("events");
|
|
45
|
-
var
|
|
36
|
+
var import_RoomExceptions = require("../errors/RoomExceptions.ts");
|
|
37
|
+
var import_Debug = require("../Debug.ts");
|
|
46
38
|
const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2e3);
|
|
47
39
|
const MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME = Number(process.env.COLYSEUS_MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME || 0.5);
|
|
48
40
|
function generateId(length = 9) {
|
|
49
|
-
return (0, import_nanoid.
|
|
41
|
+
return (0, import_nanoid.nanoid)(length);
|
|
50
42
|
}
|
|
51
43
|
function getBearerToken(authHeader) {
|
|
52
44
|
return authHeader && authHeader.startsWith("Bearer ") && authHeader.substring(7, authHeader.length) || void 0;
|
|
@@ -64,6 +56,7 @@ function retry(cb, maxRetries = 3, errorWhiteList = [], retries = 0) {
|
|
|
64
56
|
cb().then(resolve).catch((e) => {
|
|
65
57
|
if (errorWhiteList.indexOf(e.constructor) !== -1 && retries++ < maxRetries) {
|
|
66
58
|
setTimeout(() => {
|
|
59
|
+
(0, import_Debug.debugMatchMaking)("retrying due to error (error: %s, retries: %s, maxRetries: %s)", e.message, retries, maxRetries);
|
|
67
60
|
retry(cb, maxRetries, errorWhiteList, retries).then(resolve).catch((e2) => reject(e2));
|
|
68
61
|
}, Math.floor(Math.random() * Math.pow(2, retries) * 400));
|
|
69
62
|
} else {
|
|
@@ -90,8 +83,8 @@ class Deferred {
|
|
|
90
83
|
this.reject = reject;
|
|
91
84
|
});
|
|
92
85
|
}
|
|
93
|
-
then(
|
|
94
|
-
return this.promise.then
|
|
86
|
+
then(onFulfilled, onRejected) {
|
|
87
|
+
return this.promise.then(onFulfilled, onRejected);
|
|
95
88
|
}
|
|
96
89
|
catch(func) {
|
|
97
90
|
return this.promise.catch(func);
|
package/build/utils/Utils.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/Utils.ts"],
|
|
4
|
-
"sourcesContent": ["import nanoid from 'nanoid';\n\nimport { EventEmitter } from \"events\";\nimport { RoomException } from '../errors/RoomExceptions.
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": [
|
|
4
|
+
"sourcesContent": ["import { nanoid } from 'nanoid';\n\nimport { EventEmitter } from \"events\";\nimport { type RoomException, type RoomMethodName } from '../errors/RoomExceptions.ts';\n\nimport { debugAndPrintError, debugMatchMaking } from '../Debug.ts';\n\nexport type Type<T> = new (...args: any[]) => T;\nexport type MethodName<T> = string & {\n [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never\n}[keyof T];\n\n/**\n * Utility type that extracts the return type of a method or the type of a property\n * from a given class/object type.\n *\n * - If the key is a method, returns the awaited return type of that method\n * - If the key is a property, returns the type of that property\n */\nexport type ExtractMethodOrPropertyType<\n TClass,\n TKey extends keyof TClass\n> = TClass[TKey] extends (...args: any[]) => infer R\n ? Awaited<R>\n : TClass[TKey];\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\nexport const MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME = Number(process.env.COLYSEUS_MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME || 0.5);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\nexport function getBearerToken(authHeader: string) {\n return (authHeader && authHeader.startsWith(\"Bearer \") && authHeader.substring(7, authHeader.length)) || undefined;\n}\n\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e: any) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n debugMatchMaking(\"retrying due to error (error: %s, retries: %s, maxRetries: %s)\", e.message, retries, maxRetries);\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T = any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor(promise?: Promise<T>) {\n this.promise = promise ?? new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(onFulfilled?: (value: T) => any, onRejected?: (reason: any) => any) {\n return this.promise.then(onFulfilled, onRejected);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n static reject (reason?: any) {\n return new Deferred(Promise.reject(reason));\n }\n\n static resolve<T = any>(value?: T) {\n return new Deferred<T>(Promise.resolve(value));\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport function wrapTryCatch(\n method: Function,\n onError: (error: RoomException, methodName: RoomMethodName) => void,\n exceptionClass: Type<RoomException>,\n methodName: RoomMethodName,\n rethrow: boolean = false,\n ...additionalErrorArgs: any[]\n) {\n return (...args: any[]) => {\n try {\n const result = method(...args);\n if (typeof (result?.catch) === \"function\") {\n return result.catch((e: Error) => {\n onError(new exceptionClass(e, e.message, ...args, ...additionalErrorArgs), methodName);\n if (rethrow) { throw e; }\n });\n }\n return result;\n } catch (e: any) {\n onError(new exceptionClass(e, e.message, ...args, ...additionalErrorArgs), methodName);\n if (rethrow) { throw e; }\n }\n };\n}\n\nexport class HttpServerMock extends EventEmitter {}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
package/build/utils/Utils.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// packages/core/src/utils/Utils.ts
|
|
2
|
-
import nanoid from "nanoid";
|
|
2
|
+
import { nanoid } from "nanoid";
|
|
3
3
|
import { EventEmitter } from "events";
|
|
4
|
-
import
|
|
4
|
+
import "../errors/RoomExceptions.mjs";
|
|
5
|
+
import { debugAndPrintError, debugMatchMaking } from "../Debug.mjs";
|
|
5
6
|
var REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2e3);
|
|
6
7
|
var MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME = Number(process.env.COLYSEUS_MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME || 0.5);
|
|
7
8
|
function generateId(length = 9) {
|
|
@@ -23,6 +24,7 @@ function retry(cb, maxRetries = 3, errorWhiteList = [], retries = 0) {
|
|
|
23
24
|
cb().then(resolve).catch((e) => {
|
|
24
25
|
if (errorWhiteList.indexOf(e.constructor) !== -1 && retries++ < maxRetries) {
|
|
25
26
|
setTimeout(() => {
|
|
27
|
+
debugMatchMaking("retrying due to error (error: %s, retries: %s, maxRetries: %s)", e.message, retries, maxRetries);
|
|
26
28
|
retry(cb, maxRetries, errorWhiteList, retries).then(resolve).catch((e2) => reject(e2));
|
|
27
29
|
}, Math.floor(Math.random() * Math.pow(2, retries) * 400));
|
|
28
30
|
} else {
|
|
@@ -49,8 +51,8 @@ var Deferred = class _Deferred {
|
|
|
49
51
|
this.reject = reject;
|
|
50
52
|
});
|
|
51
53
|
}
|
|
52
|
-
then(
|
|
53
|
-
return this.promise.then
|
|
54
|
+
then(onFulfilled, onRejected) {
|
|
55
|
+
return this.promise.then(onFulfilled, onRejected);
|
|
54
56
|
}
|
|
55
57
|
catch(func) {
|
|
56
58
|
return this.promise.catch(func);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/Utils.ts"],
|
|
4
|
-
"sourcesContent": ["import nanoid from 'nanoid';\n\nimport { EventEmitter } from \"events\";\nimport { RoomException } from '../errors/RoomExceptions.
|
|
5
|
-
"mappings": ";AAAA,
|
|
4
|
+
"sourcesContent": ["import { nanoid } from 'nanoid';\n\nimport { EventEmitter } from \"events\";\nimport { type RoomException, type RoomMethodName } from '../errors/RoomExceptions.ts';\n\nimport { debugAndPrintError, debugMatchMaking } from '../Debug.ts';\n\nexport type Type<T> = new (...args: any[]) => T;\nexport type MethodName<T> = string & {\n [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never\n}[keyof T];\n\n/**\n * Utility type that extracts the return type of a method or the type of a property\n * from a given class/object type.\n *\n * - If the key is a method, returns the awaited return type of that method\n * - If the key is a property, returns the type of that property\n */\nexport type ExtractMethodOrPropertyType<\n TClass,\n TKey extends keyof TClass\n> = TClass[TKey] extends (...args: any[]) => infer R\n ? Awaited<R>\n : TClass[TKey];\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\nexport const MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME = Number(process.env.COLYSEUS_MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME || 0.5);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\nexport function getBearerToken(authHeader: string) {\n return (authHeader && authHeader.startsWith(\"Bearer \") && authHeader.substring(7, authHeader.length)) || undefined;\n}\n\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e: any) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n debugMatchMaking(\"retrying due to error (error: %s, retries: %s, maxRetries: %s)\", e.message, retries, maxRetries);\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T = any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor(promise?: Promise<T>) {\n this.promise = promise ?? new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(onFulfilled?: (value: T) => any, onRejected?: (reason: any) => any) {\n return this.promise.then(onFulfilled, onRejected);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n static reject (reason?: any) {\n return new Deferred(Promise.reject(reason));\n }\n\n static resolve<T = any>(value?: T) {\n return new Deferred<T>(Promise.resolve(value));\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport function wrapTryCatch(\n method: Function,\n onError: (error: RoomException, methodName: RoomMethodName) => void,\n exceptionClass: Type<RoomException>,\n methodName: RoomMethodName,\n rethrow: boolean = false,\n ...additionalErrorArgs: any[]\n) {\n return (...args: any[]) => {\n try {\n const result = method(...args);\n if (typeof (result?.catch) === \"function\") {\n return result.catch((e: Error) => {\n onError(new exceptionClass(e, e.message, ...args, ...additionalErrorArgs), methodName);\n if (rethrow) { throw e; }\n });\n }\n return result;\n } catch (e: any) {\n onError(new exceptionClass(e, e.message, ...args, ...additionalErrorArgs), methodName);\n if (rethrow) { throw e; }\n }\n };\n}\n\nexport class HttpServerMock extends EventEmitter {}"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,cAAc;AAEvB,SAAS,oBAAoB;AAC7B,OAAwD;AAExD,SAAS,oBAAoB,wBAAwB;AAsB9C,IAAM,4BAA4B,OAAO,QAAQ,IAAI,mCAAmC,GAAI;AAC5F,IAAM,uCAAuC,OAAO,QAAQ,IAAI,iDAAiD,GAAG;AAEpH,SAAS,WAAW,SAAiB,GAAG;AAC7C,SAAO,OAAO,MAAM;AACtB;AAEO,SAAS,eAAe,YAAoB;AACjD,SAAQ,cAAc,WAAW,WAAW,SAAS,KAAK,WAAW,UAAU,GAAG,WAAW,MAAM,KAAM;AAC3G;AAKA,IAAM,UAA4B,CAAC,UAAU,WAAW,SAAS;AAE1D,SAAS,yBAAyB,UAAiC;AAIxE,UAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,uBAAmB,GAAG;AACtB,aAAS,GAAG;AAAA,EACd,CAAC;AAED,UAAQ,QAAQ,CAAC,WACf,QAAQ,KAAK,QAAQ,MAAM,SAAS,CAAC,CAAC;AAC1C;AAEO,SAAS,MACd,IACA,aAAqB,GACrB,iBAAwB,CAAC,GACzB,UAAkB,GAClB;AACA,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,OAAG,EACA,KAAK,OAAO,EACZ,MAAM,CAAC,MAAW;AACjB,UACE,eAAe,QAAQ,EAAE,WAAW,MAAM,MAC1C,YAAY,YACZ;AACA,mBAAW,MAAM;AACf,2BAAiB,kEAAkE,EAAE,SAAS,SAAS,UAAU;AACjH,gBAAS,IAAI,YAAY,gBAAgB,OAAO,EAC9C,KAAK,OAAO,EACZ,MAAM,CAAC,OAAO,OAAO,EAAE,CAAC;AAAA,QAC5B,GAAG,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,GAAG,CAAC;AAAA,MAE3D,OAAO;AACL,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACH;AAEO,SAAS,UAAU,KAAY,OAAwB;AAG5D,MAAI,UAAU,MAAM,SAAS,IAAI,QAAQ;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,IAAI,SAAS;AACzB,WAAS,IAAI,OAAO,IAAI,KAAK,KAAK;AAChC,QAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,EACpB;AAEA,MAAI,SAAS;AACb,SAAO;AACT;AAEO,IAAM,WAAN,MAAM,UAAkB;AAAA,EAM7B,YAAY,SAAsB;AAChC,SAAK,UAAU,WAAW,IAAI,QAAW,CAAC,SAAS,WAAW;AAC5D,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEO,KAAK,aAAiC,YAAmC;AAC9E,WAAO,KAAK,QAAQ,KAAK,aAAa,UAAU;AAAA,EAClD;AAAA,EAEO,MAAM,MAA2B;AACtC,WAAO,KAAK,QAAQ,MAAM,IAAI;AAAA,EAChC;AAAA,EAEA,OAAO,OAAQ,QAAc;AAC3B,WAAO,IAAI,UAAS,QAAQ,OAAO,MAAM,CAAC;AAAA,EAC5C;AAAA,EAEA,OAAO,QAAiB,OAAW;AACjC,WAAO,IAAI,UAAY,QAAQ,QAAQ,KAAK,CAAC;AAAA,EAC/C;AAEF;AAEO,SAAS,MAAM,MAAW,MAAkB;AACjD,WAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;AAC/C,UAAM,IAAI,KAAK,CAAC;AAChB,eAAW,OAAO,GAAG;AACnB,UAAI,EAAE,eAAe,GAAG,GAAG;AACzB,UAAE,GAAG,IAAI,EAAE,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,aACd,QACA,SACA,gBACA,YACA,UAAmB,UAChB,qBACH;AACA,SAAO,IAAI,SAAgB;AACzB,QAAI;AACF,YAAM,SAAS,OAAO,GAAG,IAAI;AAC7B,UAAI,OAAQ,QAAQ,UAAW,YAAY;AACzC,eAAO,OAAO,MAAM,CAAC,MAAa;AAChC,kBAAQ,IAAI,eAAe,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,mBAAmB,GAAG,UAAU;AACrF,cAAI,SAAS;AAAE,kBAAM;AAAA,UAAG;AAAA,QAC1B,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT,SAAS,GAAQ;AACf,cAAQ,IAAI,eAAe,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,mBAAmB,GAAG,UAAU;AACrF,UAAI,SAAS;AAAE,cAAM;AAAA,MAAG;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,IAAM,iBAAN,cAA6B,aAAa;AAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@colyseus/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Multiplayer Framework for Node.js.",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"input": "./src/index.ts",
|
|
6
7
|
"main": "./build/index.js",
|
|
7
|
-
"module": "./
|
|
8
|
+
"module": "./src/index.ts",
|
|
8
9
|
"typings": "./build/index.d.ts",
|
|
9
10
|
"exports": {
|
|
10
11
|
".": {
|
|
11
12
|
"types": "./build/index.d.ts",
|
|
12
|
-
"import": "./
|
|
13
|
+
"import": "./src/index.ts",
|
|
13
14
|
"require": "./build/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./*": {
|
|
17
|
+
"types": "./build/*.d.ts",
|
|
18
|
+
"import": "./src/*.ts",
|
|
19
|
+
"require": "./build/*.js"
|
|
14
20
|
}
|
|
15
21
|
},
|
|
16
22
|
"funding": "https://github.com/sponsors/endel",
|
|
@@ -35,27 +41,27 @@
|
|
|
35
41
|
},
|
|
36
42
|
"homepage": "https://colyseus.io/",
|
|
37
43
|
"engines": {
|
|
38
|
-
"node": ">=
|
|
44
|
+
"node": ">= 22.x"
|
|
39
45
|
},
|
|
40
46
|
"dependencies": {
|
|
41
|
-
"@colyseus/timer": "^
|
|
47
|
+
"@colyseus/timer": "^2.0.0",
|
|
42
48
|
"@colyseus/msgpackr": "^1.11.2",
|
|
49
|
+
"@standard-schema/spec": "^1.0.0",
|
|
43
50
|
"debug": "^4.3.4",
|
|
44
|
-
"nanoid": "^
|
|
45
|
-
"@colyseus/
|
|
51
|
+
"nanoid": "^3.3.11",
|
|
52
|
+
"@colyseus/better-call": "^1.0.26",
|
|
53
|
+
"@colyseus/greeting-banner": "^3.0.0"
|
|
46
54
|
},
|
|
47
55
|
"devDependencies": {
|
|
48
|
-
"@
|
|
56
|
+
"@colyseus/schema": "^4.0.1"
|
|
49
57
|
},
|
|
50
58
|
"peerDependencies": {
|
|
51
|
-
"@colyseus/schema": "^
|
|
52
|
-
"@pm2/io": "^6.1.0"
|
|
59
|
+
"@colyseus/schema": "^4.0.1",
|
|
60
|
+
"@pm2/io": "^6.1.0",
|
|
61
|
+
"zod": "^4.1.12"
|
|
53
62
|
},
|
|
54
63
|
"publishConfig": {
|
|
55
64
|
"access": "public"
|
|
56
65
|
},
|
|
57
|
-
"gitHead": "c45b410e99eadffff4b74e701339992e2faa15f8"
|
|
58
|
-
"scripts": {
|
|
59
|
-
"tslint": "tslint --project . --config ../../tslint.json"
|
|
60
|
-
}
|
|
66
|
+
"gitHead": "c45b410e99eadffff4b74e701339992e2faa15f8"
|
|
61
67
|
}
|