@colyseus/core 0.16.0-preview.32 → 0.16.0-preview.34

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/README.md CHANGED
@@ -7,19 +7,19 @@
7
7
  <a href="https://npmjs.com/package/colyseus">
8
8
  <img src="https://img.shields.io/npm/dm/colyseus.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAHdElNRQfjAgETESWYxR33AAAAtElEQVQoz4WQMQrCQBRE38Z0QoTcwF4Qg1h4BO0sxGOk80iCtViksrIQRRBTewWxMI1mbELYjYu+4rPMDPtn12ChMT3gavb4US5Jym0tcBIta3oDHv4Gwmr7nC4QAxBrCdzM2q6XqUnm9m9r59h7Rc0n2pFv24k4ttGMUXW+sGELTJjSr7QDKuqLS6UKFChVWWuFkZw9Z2AAvAirKT+JTlppIRnd6XgaP4goefI2Shj++OnjB3tBmHYK8z9zAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE5LTAyLTAxVDE4OjE3OjM3KzAxOjAwGQQixQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOS0wMi0wMVQxODoxNzozNyswMTowMGhZmnkAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC">
9
9
  </a>
10
- <a href="http://chat.colyseus.io">
11
- <img src="https://img.shields.io/discord/525739117951320081.svg?style=for-the-badge&colorB=7581dc&logo=discord&logoColor=white">
12
- </a>
13
10
  <a href="https://github.com/colyseus/colyseus/discussions" title="Discuss on Forum">
14
11
  <img src="https://img.shields.io/badge/discuss-on%20forum-brightgreen.svg?style=for-the-badge&colorB=0069b8&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAHdElNRQfjAgETDROxCNUzAAABB0lEQVQoz4WRvyvEARjGP193CnWRH+dHQmGwKZtFGcSmxHAL400GN95ktIpV2dzlLzDJgsGgGNRdDAzoQueS/PgY3HXHyT3T+/Y87/s89UANBKXBdoZo5J6L4K1K5ZxHfnjnlQUf3bKvkgy57a0r9hS3cXfMO1kWJMza++tj3Ac7/LY343x1NA9cNmYMwnSS/SP8JVFuSJmr44iFqvtmpjhmhBCrOOazCesq6H4P3bPBjFoIBydOk2bUA17I080Es+wSZ51B4DIA2zgjSpYcEe44Js01G0XjRcCU+y4ZMrDeLmfc9EnVd5M/o0VMeu6nJZxWJivLmhyw1WHTvrr2b4+2OFqra+ALwouTMDcqmjMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTktMDItMDFUMTg6MTM6MTkrMDE6MDAC9f6fAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE5LTAyLTAxVDE4OjEzOjE5KzAxOjAwc6hGIwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAASUVORK5CYII=" alt="Discussion forum" />
15
12
  </a>
13
+ <a href="http://chat.colyseus.io">
14
+ <img src="https://img.shields.io/discord/525739117951320081.svg?style=for-the-badge&colorB=7581dc&logo=discord&logoColor=white">
15
+ </a>
16
16
  <h3>
17
17
  Multiplayer Framework for Node.js. <br /><a href="https://docs.colyseus.io/">View documentation</a>
18
18
  </h3>
19
19
  </div>
20
20
 
21
- Colyseus is an Authoritative Multiplayer Framework for Node.js, with SDKs
22
- available for the Web, Unity, Defold, Haxe, Cocos and Construct3. ([See official SDKs](https://docs.colyseus.io/client/))
21
+ Colyseus is an Authoritative Multiplayer Framework for Node.js, with clients
22
+ available for the Web, Unity3d, Defold, Haxe, and Cocos. ([See official clients](#%EF%B8%8F-official-client-integration))
23
23
 
24
24
  The project focuses on providing synchronizable data structures for realtime and
25
25
  turn-based games, matchmaking, and ease of usage both on the server-side and
package/build/index.d.ts CHANGED
@@ -13,6 +13,7 @@ export { type Presence } from './presence/Presence.js';
13
13
  export { LocalPresence } from './presence/LocalPresence.js';
14
14
  export { type Serializer } from './serializer/Serializer.js';
15
15
  export { SchemaSerializer } from './serializer/SchemaSerializer.js';
16
+ export { SchemaSerializerDebug } from './serializer/SchemaSerializerDebug.js';
16
17
  export { Clock, Delayed };
17
18
  export { generateId, Deferred, HttpServerMock, spliceOne, getBearerToken } from './utils/Utils.js';
18
19
  export { isDevMode } from './utils/DevMode.js';
package/build/index.js CHANGED
@@ -43,6 +43,7 @@ __export(src_exports, {
43
43
  Room: () => import_Room.Room,
44
44
  RoomInternalState: () => import_Room.RoomInternalState,
45
45
  SchemaSerializer: () => import_SchemaSerializer.SchemaSerializer,
46
+ SchemaSerializerDebug: () => import_SchemaSerializerDebug.SchemaSerializerDebug,
46
47
  Server: () => import_Server.Server,
47
48
  ServerError: () => import_ServerError.ServerError,
48
49
  Transport: () => import_Transport.Transport,
@@ -79,6 +80,7 @@ __reExport(src_exports, require("./matchmaker/driver/local/LocalDriver.js"), mod
79
80
  var import_Transport = require("./Transport.js");
80
81
  var import_LocalPresence = require("./presence/LocalPresence.js");
81
82
  var import_SchemaSerializer = require("./serializer/SchemaSerializer.js");
83
+ var import_SchemaSerializerDebug = require("./serializer/SchemaSerializerDebug.js");
82
84
  var import_Utils = require("./utils/Utils.js");
83
85
  var import_DevMode = require("./utils/DevMode.js");
84
86
  var import_IPC = require("./IPC.js");
@@ -103,6 +105,7 @@ var import_Logger = require("./Logger.js");
103
105
  Room,
104
106
  RoomInternalState,
105
107
  SchemaSerializer,
108
+ SchemaSerializerDebug,
106
109
  Server,
107
110
  ServerError,
108
111
  Transport,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
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\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, 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\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;AAAA;AAAA;AAAA;AAAA,4BAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA+B;AAG/B,oBAA2C;AAC3C,kBAAwC;AACxC,sBAAqD;AACrD,+BAAkC;AAClC,yBAA4B;AAG5B,iBAA4B;AAE5B,mBAA4C;AAG5C,wBAAc,qDAfd;AAkBA,uBAAwG;AAIxG,2BAA8B;AAI9B,8BAAiC;AAIjC,mBAAgF;AAChF,qBAA0B;AAG1B,iBAA6C;AAG7C,mBASO;AAGP,uBAA0B;AAC1B,uBAA0B;AAG1B,oBAAuB;",
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\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, 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';\nexport { 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;AAAA;AAAA;AAAA;AAAA,4BAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA+B;AAG/B,oBAA2C;AAC3C,kBAAwC;AACxC,sBAAqD;AACrD,+BAAkC;AAClC,yBAA4B;AAG5B,iBAA4B;AAE5B,mBAA4C;AAG5C,wBAAc,qDAfd;AAkBA,uBAAwG;AAIxG,2BAA8B;AAI9B,8BAAiC;AACjC,mCAAsC;AAItC,mBAAgF;AAChF,qBAA0B;AAG1B,iBAA6C;AAG7C,mBASO;AAGP,uBAA0B;AAC1B,uBAA0B;AAG1B,oBAAuB;",
6
6
  "names": ["Clock"]
7
7
  }
package/build/index.mjs CHANGED
@@ -11,6 +11,7 @@ export * from "./matchmaker/driver/local/LocalDriver.mjs";
11
11
  import { ClientState, ClientArray, Transport } from "./Transport.mjs";
12
12
  import { LocalPresence } from "./presence/LocalPresence.mjs";
13
13
  import { SchemaSerializer } from "./serializer/SchemaSerializer.mjs";
14
+ import { SchemaSerializerDebug } from "./serializer/SchemaSerializerDebug.mjs";
14
15
  import { generateId, Deferred, HttpServerMock, spliceOne, getBearerToken } from "./utils/Utils.mjs";
15
16
  import { isDevMode } from "./utils/DevMode.mjs";
16
17
  import { subscribeIPC, requestFromIPC } from "./IPC.mjs";
@@ -43,6 +44,7 @@ export {
43
44
  Room,
44
45
  RoomInternalState,
45
46
  SchemaSerializer,
47
+ SchemaSerializerDebug,
46
48
  Server,
47
49
  ServerError,
48
50
  Transport,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
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\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, 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\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;AAG5B,YAAY,gBAAgB;AAE5B,SAAS,aAAa,sBAAsB;AAG5C,cAAc;AAGd,SAA0C,aAAa,aAAa,iBAAoC;AAIxG,SAAS,qBAAqB;AAI9B,SAAS,wBAAwB;AAIjC,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;",
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\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, 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';\nexport { 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;AAG5B,YAAY,gBAAgB;AAE5B,SAAS,aAAa,sBAAsB;AAG5C,cAAc;AAGd,SAA0C,aAAa,aAAa,iBAAoC;AAIxG,SAAS,qBAAqB;AAI9B,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AAItC,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,5 +1,5 @@
1
- import { RoomCache, IRoomCache } from './interfaces';
2
- export declare class RoomData implements RoomCache {
1
+ import { RoomListingData } from './interfaces';
2
+ export declare class RoomCache implements RoomListingData {
3
3
  clients: number;
4
4
  locked: boolean;
5
5
  private: boolean;
@@ -12,7 +12,7 @@ export declare class RoomData implements RoomCache {
12
12
  createdAt: Date;
13
13
  unlisted: boolean;
14
14
  private $rooms;
15
- constructor(initialValues: any, rooms: IRoomCache[]);
15
+ constructor(initialValues: any, rooms: RoomCache[]);
16
16
  save(): void;
17
17
  updateOne(operations: any): void;
18
18
  remove(): void;
@@ -17,11 +17,11 @@ var __copyProps = (to, from, except, desc) => {
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
18
  var RoomData_exports = {};
19
19
  __export(RoomData_exports, {
20
- RoomData: () => RoomData
20
+ RoomCache: () => RoomCache
21
21
  });
22
22
  module.exports = __toCommonJS(RoomData_exports);
23
23
  var import_Utils = require("../../utils/Utils");
24
- class RoomData {
24
+ class RoomCache {
25
25
  constructor(initialValues, rooms) {
26
26
  this.clients = 0;
27
27
  this.locked = false;
@@ -75,5 +75,5 @@ class RoomData {
75
75
  }
76
76
  // Annotate the CommonJS export names for ESM import in node:
77
77
  0 && (module.exports = {
78
- RoomData
78
+ RoomCache
79
79
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/matchmaker/driver/RoomData.ts"],
4
- "sourcesContent": ["import { spliceOne } from '../../utils/Utils';\nimport { RoomCache, IRoomCache } from './interfaces';\n\nexport class RoomData implements RoomCache {\n public clients: number = 0;\n public locked: boolean = false;\n public private: boolean = false;\n public maxClients: number = Infinity;\n public metadata: any;\n public name: string;\n public publicAddress: string;\n public processId: string;\n public roomId: string;\n public createdAt: Date;\n public unlisted: boolean = false;\n\n private $rooms: RoomCache[];\n\n constructor(initialValues: any, rooms: IRoomCache[]) {\n this.createdAt = new Date();\n\n for (const field in initialValues) {\n if (initialValues.hasOwnProperty(field)) {\n this[field] = initialValues[field];\n }\n }\n\n // make $rooms non-enumerable, so it can be serialized (circular references)\n Object.defineProperty(this, \"$rooms\", {\n value: rooms,\n enumerable: false,\n writable: true,\n });\n }\n\n public save() {\n if (this.$rooms.indexOf(this) === -1) {\n this.$rooms.push(this);\n }\n }\n\n public updateOne(operations: any) {\n if (operations.$set) {\n for (const field in operations.$set) {\n if (operations.$set.hasOwnProperty(field)) {\n this[field] = operations.$set[field];\n }\n }\n }\n\n if (operations.$inc) {\n for (const field in operations.$inc) {\n if (operations.$inc.hasOwnProperty(field)) {\n this[field] += operations.$inc[field];\n }\n }\n }\n }\n\n public remove() {\n //\n // WORKAROUND: prevent calling `.remove()` multiple times\n // Seems to happen during disconnect + dispose: https://github.com/colyseus/colyseus/issues/390\n //\n if (!this.$rooms) { return; }\n\n const roomIndex = this.$rooms.indexOf(this);\n if (roomIndex === -1) { return; }\n\n spliceOne(this.$rooms, roomIndex);\n this.$rooms = null;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0B;AAGnB,MAAM,SAA8B;AAAA,EAezC,YAAY,eAAoB,OAAqB;AAdrD,SAAO,UAAkB;AACzB,SAAO,SAAkB;AACzB,SAAO,UAAmB;AAC1B,SAAO,aAAqB;AAO5B,SAAO,WAAoB;AAKzB,SAAK,YAAY,IAAI,KAAK;AAE1B,eAAW,SAAS,eAAe;AACjC,UAAI,cAAc,eAAe,KAAK,GAAG;AACvC,aAAK,SAAS,cAAc;AAAA,MAC9B;AAAA,IACF;AAGA,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEO,OAAO;AACZ,QAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,IAAI;AACpC,WAAK,OAAO,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AAAA,EAEO,UAAU,YAAiB;AAChC,QAAI,WAAW,MAAM;AACnB,iBAAW,SAAS,WAAW,MAAM;AACnC,YAAI,WAAW,KAAK,eAAe,KAAK,GAAG;AACzC,eAAK,SAAS,WAAW,KAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,MAAM;AACnB,iBAAW,SAAS,WAAW,MAAM;AACnC,YAAI,WAAW,KAAK,eAAe,KAAK,GAAG;AACzC,eAAK,UAAU,WAAW,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,SAAS;AAKd,QAAI,CAAC,KAAK,QAAQ;AAAE;AAAA,IAAQ;AAE5B,UAAM,YAAY,KAAK,OAAO,QAAQ,IAAI;AAC1C,QAAI,cAAc,IAAI;AAAE;AAAA,IAAQ;AAEhC,gCAAU,KAAK,QAAQ,SAAS;AAChC,SAAK,SAAS;AAAA,EAChB;AACF;",
4
+ "sourcesContent": ["import { spliceOne } from '../../utils/Utils';\nimport { RoomListingData } from './interfaces';\n\nexport class RoomCache implements RoomListingData {\n public clients: number = 0;\n public locked: boolean = false;\n public private: boolean = false;\n public maxClients: number = Infinity;\n public metadata: any;\n public name: string;\n public publicAddress: string;\n public processId: string;\n public roomId: string;\n public createdAt: Date;\n public unlisted: boolean = false;\n\n private $rooms: RoomCache[];\n\n constructor(initialValues: any, rooms: RoomCache[]) {\n this.createdAt = new Date();\n\n for (const field in initialValues) {\n if (initialValues.hasOwnProperty(field)) {\n this[field] = initialValues[field];\n }\n }\n\n // make $rooms non-enumerable, so it can be serialized (circular references)\n Object.defineProperty(this, \"$rooms\", {\n value: rooms,\n enumerable: false,\n writable: true,\n });\n }\n\n public save() {\n if (this.$rooms.indexOf(this) === -1) {\n this.$rooms.push(this);\n }\n }\n\n public updateOne(operations: any) {\n if (operations.$set) {\n for (const field in operations.$set) {\n if (operations.$set.hasOwnProperty(field)) {\n this[field] = operations.$set[field];\n }\n }\n }\n\n if (operations.$inc) {\n for (const field in operations.$inc) {\n if (operations.$inc.hasOwnProperty(field)) {\n this[field] += operations.$inc[field];\n }\n }\n }\n }\n\n public remove() {\n //\n // WORKAROUND: prevent calling `.remove()` multiple times\n // Seems to happen during disconnect + dispose: https://github.com/colyseus/colyseus/issues/390\n //\n if (!this.$rooms) { return; }\n\n const roomIndex = this.$rooms.indexOf(this);\n if (roomIndex === -1) { return; }\n\n spliceOne(this.$rooms, roomIndex);\n this.$rooms = null;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0B;AAGnB,MAAM,UAAqC;AAAA,EAehD,YAAY,eAAoB,OAAoB;AAdpD,SAAO,UAAkB;AACzB,SAAO,SAAkB;AACzB,SAAO,UAAmB;AAC1B,SAAO,aAAqB;AAO5B,SAAO,WAAoB;AAKzB,SAAK,YAAY,IAAI,KAAK;AAE1B,eAAW,SAAS,eAAe;AACjC,UAAI,cAAc,eAAe,KAAK,GAAG;AACvC,aAAK,SAAS,cAAc;AAAA,MAC9B;AAAA,IACF;AAGA,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEO,OAAO;AACZ,QAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,IAAI;AACpC,WAAK,OAAO,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AAAA,EAEO,UAAU,YAAiB;AAChC,QAAI,WAAW,MAAM;AACnB,iBAAW,SAAS,WAAW,MAAM;AACnC,YAAI,WAAW,KAAK,eAAe,KAAK,GAAG;AACzC,eAAK,SAAS,WAAW,KAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,MAAM;AACnB,iBAAW,SAAS,WAAW,MAAM;AACnC,YAAI,WAAW,KAAK,eAAe,KAAK,GAAG;AACzC,eAAK,UAAU,WAAW,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,SAAS;AAKd,QAAI,CAAC,KAAK,QAAQ;AAAE;AAAA,IAAQ;AAE5B,UAAM,YAAY,KAAK,OAAO,QAAQ,IAAI;AAC1C,QAAI,cAAc,IAAI;AAAE;AAAA,IAAQ;AAEhC,gCAAU,KAAK,QAAQ,SAAS;AAChC,SAAK,SAAS;AAAA,EAChB;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import { spliceOne } from "../../utils/Utils";
2
- class RoomData {
2
+ class RoomCache {
3
3
  constructor(initialValues, rooms) {
4
4
  this.clients = 0;
5
5
  this.locked = false;
@@ -52,5 +52,5 @@ class RoomData {
52
52
  }
53
53
  }
54
54
  export {
55
- RoomData
55
+ RoomCache
56
56
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/matchmaker/driver/RoomData.ts"],
4
- "sourcesContent": ["import { spliceOne } from '../../utils/Utils';\nimport { RoomCache, IRoomCache } from './interfaces';\n\nexport class RoomData implements RoomCache {\n public clients: number = 0;\n public locked: boolean = false;\n public private: boolean = false;\n public maxClients: number = Infinity;\n public metadata: any;\n public name: string;\n public publicAddress: string;\n public processId: string;\n public roomId: string;\n public createdAt: Date;\n public unlisted: boolean = false;\n\n private $rooms: RoomCache[];\n\n constructor(initialValues: any, rooms: IRoomCache[]) {\n this.createdAt = new Date();\n\n for (const field in initialValues) {\n if (initialValues.hasOwnProperty(field)) {\n this[field] = initialValues[field];\n }\n }\n\n // make $rooms non-enumerable, so it can be serialized (circular references)\n Object.defineProperty(this, \"$rooms\", {\n value: rooms,\n enumerable: false,\n writable: true,\n });\n }\n\n public save() {\n if (this.$rooms.indexOf(this) === -1) {\n this.$rooms.push(this);\n }\n }\n\n public updateOne(operations: any) {\n if (operations.$set) {\n for (const field in operations.$set) {\n if (operations.$set.hasOwnProperty(field)) {\n this[field] = operations.$set[field];\n }\n }\n }\n\n if (operations.$inc) {\n for (const field in operations.$inc) {\n if (operations.$inc.hasOwnProperty(field)) {\n this[field] += operations.$inc[field];\n }\n }\n }\n }\n\n public remove() {\n //\n // WORKAROUND: prevent calling `.remove()` multiple times\n // Seems to happen during disconnect + dispose: https://github.com/colyseus/colyseus/issues/390\n //\n if (!this.$rooms) { return; }\n\n const roomIndex = this.$rooms.indexOf(this);\n if (roomIndex === -1) { return; }\n\n spliceOne(this.$rooms, roomIndex);\n this.$rooms = null;\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,iBAAiB;AAGnB,MAAM,SAA8B;AAAA,EAezC,YAAY,eAAoB,OAAqB;AAdrD,SAAO,UAAkB;AACzB,SAAO,SAAkB;AACzB,SAAO,UAAmB;AAC1B,SAAO,aAAqB;AAO5B,SAAO,WAAoB;AAKzB,SAAK,YAAY,IAAI,KAAK;AAE1B,eAAW,SAAS,eAAe;AACjC,UAAI,cAAc,eAAe,KAAK,GAAG;AACvC,aAAK,SAAS,cAAc;AAAA,MAC9B;AAAA,IACF;AAGA,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEO,OAAO;AACZ,QAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,IAAI;AACpC,WAAK,OAAO,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AAAA,EAEO,UAAU,YAAiB;AAChC,QAAI,WAAW,MAAM;AACnB,iBAAW,SAAS,WAAW,MAAM;AACnC,YAAI,WAAW,KAAK,eAAe,KAAK,GAAG;AACzC,eAAK,SAAS,WAAW,KAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,MAAM;AACnB,iBAAW,SAAS,WAAW,MAAM;AACnC,YAAI,WAAW,KAAK,eAAe,KAAK,GAAG;AACzC,eAAK,UAAU,WAAW,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,SAAS;AAKd,QAAI,CAAC,KAAK,QAAQ;AAAE;AAAA,IAAQ;AAE5B,UAAM,YAAY,KAAK,OAAO,QAAQ,IAAI;AAC1C,QAAI,cAAc,IAAI;AAAE;AAAA,IAAQ;AAEhC,cAAU,KAAK,QAAQ,SAAS;AAChC,SAAK,SAAS;AAAA,EAChB;AACF;",
4
+ "sourcesContent": ["import { spliceOne } from '../../utils/Utils';\nimport { RoomListingData } from './interfaces';\n\nexport class RoomCache implements RoomListingData {\n public clients: number = 0;\n public locked: boolean = false;\n public private: boolean = false;\n public maxClients: number = Infinity;\n public metadata: any;\n public name: string;\n public publicAddress: string;\n public processId: string;\n public roomId: string;\n public createdAt: Date;\n public unlisted: boolean = false;\n\n private $rooms: RoomCache[];\n\n constructor(initialValues: any, rooms: RoomCache[]) {\n this.createdAt = new Date();\n\n for (const field in initialValues) {\n if (initialValues.hasOwnProperty(field)) {\n this[field] = initialValues[field];\n }\n }\n\n // make $rooms non-enumerable, so it can be serialized (circular references)\n Object.defineProperty(this, \"$rooms\", {\n value: rooms,\n enumerable: false,\n writable: true,\n });\n }\n\n public save() {\n if (this.$rooms.indexOf(this) === -1) {\n this.$rooms.push(this);\n }\n }\n\n public updateOne(operations: any) {\n if (operations.$set) {\n for (const field in operations.$set) {\n if (operations.$set.hasOwnProperty(field)) {\n this[field] = operations.$set[field];\n }\n }\n }\n\n if (operations.$inc) {\n for (const field in operations.$inc) {\n if (operations.$inc.hasOwnProperty(field)) {\n this[field] += operations.$inc[field];\n }\n }\n }\n }\n\n public remove() {\n //\n // WORKAROUND: prevent calling `.remove()` multiple times\n // Seems to happen during disconnect + dispose: https://github.com/colyseus/colyseus/issues/390\n //\n if (!this.$rooms) { return; }\n\n const roomIndex = this.$rooms.indexOf(this);\n if (roomIndex === -1) { return; }\n\n spliceOne(this.$rooms, roomIndex);\n this.$rooms = null;\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAGnB,MAAM,UAAqC;AAAA,EAehD,YAAY,eAAoB,OAAoB;AAdpD,SAAO,UAAkB;AACzB,SAAO,SAAkB;AACzB,SAAO,UAAmB;AAC1B,SAAO,aAAqB;AAO5B,SAAO,WAAoB;AAKzB,SAAK,YAAY,IAAI,KAAK;AAE1B,eAAW,SAAS,eAAe;AACjC,UAAI,cAAc,eAAe,KAAK,GAAG;AACvC,aAAK,SAAS,cAAc;AAAA,MAC9B;AAAA,IACF;AAGA,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEO,OAAO;AACZ,QAAI,KAAK,OAAO,QAAQ,IAAI,MAAM,IAAI;AACpC,WAAK,OAAO,KAAK,IAAI;AAAA,IACvB;AAAA,EACF;AAAA,EAEO,UAAU,YAAiB;AAChC,QAAI,WAAW,MAAM;AACnB,iBAAW,SAAS,WAAW,MAAM;AACnC,YAAI,WAAW,KAAK,eAAe,KAAK,GAAG;AACzC,eAAK,SAAS,WAAW,KAAK;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,MAAM;AACnB,iBAAW,SAAS,WAAW,MAAM;AACnC,YAAI,WAAW,KAAK,eAAe,KAAK,GAAG;AACzC,eAAK,UAAU,WAAW,KAAK;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,SAAS;AAKd,QAAI,CAAC,KAAK,QAAQ;AAAE;AAAA,IAAQ;AAE5B,UAAM,YAAY,KAAK,OAAO,QAAQ,IAAI;AAC1C,QAAI,cAAc,IAAI;AAAE;AAAA,IAAQ;AAEhC,cAAU,KAAK,QAAQ,SAAS;AAChC,SAAK,SAAS;AAAA,EAChB;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,13 +1,13 @@
1
- import { IRoomCache, SortOptions, RoomCache, QueryHelpers, MatchMakerDriver } from "./interfaces";
2
- export type { IRoomCache, SortOptions, RoomCache, QueryHelpers, MatchMakerDriver };
3
- import { RoomData } from './RoomData';
1
+ import { IRoomListingData, SortOptions, RoomListingData, QueryHelpers, MatchMakerDriver } from "./interfaces";
2
+ export type { IRoomListingData, SortOptions, RoomListingData, QueryHelpers, MatchMakerDriver };
3
+ import { RoomCache } from './RoomData';
4
4
  export declare class LocalDriver implements MatchMakerDriver {
5
- rooms: IRoomCache[];
6
- createInstance(initialValues?: any): RoomData;
5
+ rooms: RoomCache[];
6
+ createInstance(initialValues?: any): RoomCache;
7
7
  has(roomId: string): boolean;
8
- find(conditions: Partial<IRoomCache>): IRoomCache[];
8
+ find(conditions: Partial<IRoomListingData>): RoomCache[];
9
9
  cleanup(processId: string): Promise<void>;
10
- findOne(conditions: Partial<IRoomCache>): QueryHelpers<RoomCache>;
10
+ findOne(conditions: Partial<IRoomListingData>): QueryHelpers<RoomListingData<any>>;
11
11
  clear(): void;
12
12
  shutdown(): void;
13
13
  }
@@ -28,7 +28,7 @@ class LocalDriver {
28
28
  this.rooms = [];
29
29
  }
30
30
  createInstance(initialValues = {}) {
31
- return new import_RoomData.RoomData(initialValues, this.rooms);
31
+ return new import_RoomData.RoomCache(initialValues, this.rooms);
32
32
  }
33
33
  has(roomId) {
34
34
  return this.rooms.some((room) => room.roomId === roomId);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/matchmaker/driver/index.ts"],
4
- "sourcesContent": ["import { logger } from \"../../Logger\";\nimport { IRoomCache, SortOptions, RoomCache, QueryHelpers, MatchMakerDriver } from \"./interfaces\";\n\n// re-export\nexport type { IRoomCache, SortOptions, RoomCache, QueryHelpers, MatchMakerDriver };\n\nimport { Query } from './Query';\nimport { RoomData } from './RoomData';\n\nexport class LocalDriver implements MatchMakerDriver {\n public rooms: IRoomCache[] = [];\n\n public createInstance(initialValues: any = {}) {\n return new RoomData(initialValues, this.rooms);\n }\n\n public has(roomId: string) {\n return this.rooms.some((room) => room.roomId === roomId);\n }\n\n public find(conditions: Partial<IRoomCache>) {\n return this.rooms.filter(((room) => {\n for (const field in conditions) {\n if (\n conditions.hasOwnProperty(field) &&\n room[field] !== conditions[field]\n ) {\n return false;\n }\n }\n return true;\n }));\n }\n\n public cleanup(processId: string) {\n const cachedRooms = this.find({ processId });\n logger.debug(\"> Removing stale rooms by processId:\", processId, `(${cachedRooms.length} rooms found)`);\n\n cachedRooms.forEach((room) => room.remove());\n return Promise.resolve();\n }\n\n public findOne(conditions: Partial<IRoomCache>) {\n return new Query<RoomCache>(this.rooms, conditions) as any as QueryHelpers<RoomCache>;\n }\n\n public clear() {\n this.rooms = [];\n }\n\n public shutdown() {\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AAMvB,mBAAsB;AACtB,sBAAyB;AAElB,MAAM,YAAwC;AAAA,EAA9C;AACL,SAAO,QAAsB,CAAC;AAAA;AAAA,EAEvB,eAAe,gBAAqB,CAAC,GAAG;AAC7C,WAAO,IAAI,yBAAS,eAAe,KAAK,KAAK;AAAA,EAC/C;AAAA,EAEO,IAAI,QAAgB;AACzB,WAAO,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,MAAM;AAAA,EACzD;AAAA,EAEO,KAAK,YAAiC;AAC3C,WAAO,KAAK,MAAM,OAAQ,CAAC,SAAS;AAClC,iBAAW,SAAS,YAAY;AAC9B,YACE,WAAW,eAAe,KAAK,KAC/B,KAAK,WAAW,WAAW,QAC3B;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAE;AAAA,EACJ;AAAA,EAEO,QAAQ,WAAmB;AAChC,UAAM,cAAc,KAAK,KAAK,EAAE,UAAU,CAAC;AAC3C,yBAAO,MAAM,wCAAwC,WAAW,IAAI,YAAY,qBAAqB;AAErG,gBAAY,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAC3C,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEO,QAAQ,YAAiC;AAC9C,WAAO,IAAI,mBAAiB,KAAK,OAAO,UAAU;AAAA,EACpD;AAAA,EAEO,QAAQ;AACb,SAAK,QAAQ,CAAC;AAAA,EAChB;AAAA,EAEO,WAAW;AAAA,EAClB;AACF;",
4
+ "sourcesContent": ["import { logger } from \"../../Logger\";\nimport { IRoomListingData, SortOptions, RoomListingData, QueryHelpers, MatchMakerDriver } from \"./interfaces\";\n\n// re-export\nexport type { IRoomListingData, SortOptions, RoomListingData, QueryHelpers, MatchMakerDriver };\n\nimport { Query } from './Query';\nimport { RoomCache } from './RoomData';\n\nexport class LocalDriver implements MatchMakerDriver {\n public rooms: RoomCache[] = [];\n\n public createInstance(initialValues: any = {}) {\n return new RoomCache(initialValues, this.rooms);\n }\n\n public has(roomId: string) {\n return this.rooms.some((room) => room.roomId === roomId);\n }\n\n public find(conditions: Partial<IRoomListingData>) {\n return this.rooms.filter(((room) => {\n for (const field in conditions) {\n if (\n conditions.hasOwnProperty(field) &&\n room[field] !== conditions[field]\n ) {\n return false;\n }\n }\n return true;\n }));\n }\n\n public cleanup(processId: string) {\n const cachedRooms = this.find({ processId });\n logger.debug(\"> Removing stale rooms by processId:\", processId, `(${cachedRooms.length} rooms found)`);\n\n cachedRooms.forEach((room) => room.remove());\n return Promise.resolve();\n }\n\n public findOne(conditions: Partial<IRoomListingData>) {\n return new Query<RoomListingData>(this.rooms, conditions) as any as QueryHelpers<RoomListingData>;\n }\n\n public clear() {\n this.rooms = [];\n }\n\n public shutdown() {\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AAMvB,mBAAsB;AACtB,sBAA0B;AAEnB,MAAM,YAAwC;AAAA,EAA9C;AACL,SAAO,QAAqB,CAAC;AAAA;AAAA,EAEtB,eAAe,gBAAqB,CAAC,GAAG;AAC7C,WAAO,IAAI,0BAAU,eAAe,KAAK,KAAK;AAAA,EAChD;AAAA,EAEO,IAAI,QAAgB;AACzB,WAAO,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,MAAM;AAAA,EACzD;AAAA,EAEO,KAAK,YAAuC;AACjD,WAAO,KAAK,MAAM,OAAQ,CAAC,SAAS;AAClC,iBAAW,SAAS,YAAY;AAC9B,YACE,WAAW,eAAe,KAAK,KAC/B,KAAK,WAAW,WAAW,QAC3B;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAE;AAAA,EACJ;AAAA,EAEO,QAAQ,WAAmB;AAChC,UAAM,cAAc,KAAK,KAAK,EAAE,UAAU,CAAC;AAC3C,yBAAO,MAAM,wCAAwC,WAAW,IAAI,YAAY,qBAAqB;AAErG,gBAAY,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAC3C,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEO,QAAQ,YAAuC;AACpD,WAAO,IAAI,mBAAuB,KAAK,OAAO,UAAU;AAAA,EAC1D;AAAA,EAEO,QAAQ;AACb,SAAK,QAAQ,CAAC;AAAA,EAChB;AAAA,EAEO,WAAW;AAAA,EAClB;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,12 +1,12 @@
1
1
  import { logger } from "../../Logger";
2
2
  import { Query } from "./Query";
3
- import { RoomData } from "./RoomData";
3
+ import { RoomCache } from "./RoomData";
4
4
  class LocalDriver {
5
5
  constructor() {
6
6
  this.rooms = [];
7
7
  }
8
8
  createInstance(initialValues = {}) {
9
- return new RoomData(initialValues, this.rooms);
9
+ return new RoomCache(initialValues, this.rooms);
10
10
  }
11
11
  has(roomId) {
12
12
  return this.rooms.some((room) => room.roomId === roomId);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/matchmaker/driver/index.ts"],
4
- "sourcesContent": ["import { logger } from \"../../Logger\";\nimport { IRoomCache, SortOptions, RoomCache, QueryHelpers, MatchMakerDriver } from \"./interfaces\";\n\n// re-export\nexport type { IRoomCache, SortOptions, RoomCache, QueryHelpers, MatchMakerDriver };\n\nimport { Query } from './Query';\nimport { RoomData } from './RoomData';\n\nexport class LocalDriver implements MatchMakerDriver {\n public rooms: IRoomCache[] = [];\n\n public createInstance(initialValues: any = {}) {\n return new RoomData(initialValues, this.rooms);\n }\n\n public has(roomId: string) {\n return this.rooms.some((room) => room.roomId === roomId);\n }\n\n public find(conditions: Partial<IRoomCache>) {\n return this.rooms.filter(((room) => {\n for (const field in conditions) {\n if (\n conditions.hasOwnProperty(field) &&\n room[field] !== conditions[field]\n ) {\n return false;\n }\n }\n return true;\n }));\n }\n\n public cleanup(processId: string) {\n const cachedRooms = this.find({ processId });\n logger.debug(\"> Removing stale rooms by processId:\", processId, `(${cachedRooms.length} rooms found)`);\n\n cachedRooms.forEach((room) => room.remove());\n return Promise.resolve();\n }\n\n public findOne(conditions: Partial<IRoomCache>) {\n return new Query<RoomCache>(this.rooms, conditions) as any as QueryHelpers<RoomCache>;\n }\n\n public clear() {\n this.rooms = [];\n }\n\n public shutdown() {\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,cAAc;AAMvB,SAAS,aAAa;AACtB,SAAS,gBAAgB;AAElB,MAAM,YAAwC;AAAA,EAA9C;AACL,SAAO,QAAsB,CAAC;AAAA;AAAA,EAEvB,eAAe,gBAAqB,CAAC,GAAG;AAC7C,WAAO,IAAI,SAAS,eAAe,KAAK,KAAK;AAAA,EAC/C;AAAA,EAEO,IAAI,QAAgB;AACzB,WAAO,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,MAAM;AAAA,EACzD;AAAA,EAEO,KAAK,YAAiC;AAC3C,WAAO,KAAK,MAAM,OAAQ,CAAC,SAAS;AAClC,iBAAW,SAAS,YAAY;AAC9B,YACE,WAAW,eAAe,KAAK,KAC/B,KAAK,WAAW,WAAW,QAC3B;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAE;AAAA,EACJ;AAAA,EAEO,QAAQ,WAAmB;AAChC,UAAM,cAAc,KAAK,KAAK,EAAE,UAAU,CAAC;AAC3C,WAAO,MAAM,wCAAwC,WAAW,IAAI,YAAY,qBAAqB;AAErG,gBAAY,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAC3C,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEO,QAAQ,YAAiC;AAC9C,WAAO,IAAI,MAAiB,KAAK,OAAO,UAAU;AAAA,EACpD;AAAA,EAEO,QAAQ;AACb,SAAK,QAAQ,CAAC;AAAA,EAChB;AAAA,EAEO,WAAW;AAAA,EAClB;AACF;",
4
+ "sourcesContent": ["import { logger } from \"../../Logger\";\nimport { IRoomListingData, SortOptions, RoomListingData, QueryHelpers, MatchMakerDriver } from \"./interfaces\";\n\n// re-export\nexport type { IRoomListingData, SortOptions, RoomListingData, QueryHelpers, MatchMakerDriver };\n\nimport { Query } from './Query';\nimport { RoomCache } from './RoomData';\n\nexport class LocalDriver implements MatchMakerDriver {\n public rooms: RoomCache[] = [];\n\n public createInstance(initialValues: any = {}) {\n return new RoomCache(initialValues, this.rooms);\n }\n\n public has(roomId: string) {\n return this.rooms.some((room) => room.roomId === roomId);\n }\n\n public find(conditions: Partial<IRoomListingData>) {\n return this.rooms.filter(((room) => {\n for (const field in conditions) {\n if (\n conditions.hasOwnProperty(field) &&\n room[field] !== conditions[field]\n ) {\n return false;\n }\n }\n return true;\n }));\n }\n\n public cleanup(processId: string) {\n const cachedRooms = this.find({ processId });\n logger.debug(\"> Removing stale rooms by processId:\", processId, `(${cachedRooms.length} rooms found)`);\n\n cachedRooms.forEach((room) => room.remove());\n return Promise.resolve();\n }\n\n public findOne(conditions: Partial<IRoomListingData>) {\n return new Query<RoomListingData>(this.rooms, conditions) as any as QueryHelpers<RoomListingData>;\n }\n\n public clear() {\n this.rooms = [];\n }\n\n public shutdown() {\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,cAAc;AAMvB,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAEnB,MAAM,YAAwC;AAAA,EAA9C;AACL,SAAO,QAAqB,CAAC;AAAA;AAAA,EAEtB,eAAe,gBAAqB,CAAC,GAAG;AAC7C,WAAO,IAAI,UAAU,eAAe,KAAK,KAAK;AAAA,EAChD;AAAA,EAEO,IAAI,QAAgB;AACzB,WAAO,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,MAAM;AAAA,EACzD;AAAA,EAEO,KAAK,YAAuC;AACjD,WAAO,KAAK,MAAM,OAAQ,CAAC,SAAS;AAClC,iBAAW,SAAS,YAAY;AAC9B,YACE,WAAW,eAAe,KAAK,KAC/B,KAAK,WAAW,WAAW,QAC3B;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAE;AAAA,EACJ;AAAA,EAEO,QAAQ,WAAmB;AAChC,UAAM,cAAc,KAAK,KAAK,EAAE,UAAU,CAAC;AAC3C,WAAO,MAAM,wCAAwC,WAAW,IAAI,YAAY,qBAAqB;AAErG,gBAAY,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAC3C,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEO,QAAQ,YAAuC;AACpD,WAAO,IAAI,MAAuB,KAAK,OAAO,UAAU;AAAA,EAC1D;AAAA,EAEO,QAAQ;AACb,SAAK,QAAQ,CAAC;AAAA,EAChB;AAAA,EAEO,WAAW;AAAA,EAClB;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  export interface SortOptions {
2
2
  [fieldName: string]: 1 | -1 | 'asc' | 'desc' | 'ascending' | 'descending';
3
3
  }
4
- export interface IRoomCache {
4
+ export interface IRoomListingData {
5
5
  clients: number;
6
6
  locked: boolean;
7
7
  private: boolean;
@@ -14,12 +14,16 @@ export interface IRoomCache {
14
14
  unlisted: boolean;
15
15
  [property: string]: any;
16
16
  }
17
- export interface RoomCache<Metadata = any> extends IRoomCache {
17
+ export interface RoomListingData<Metadata = any> extends IRoomListingData {
18
18
  metadata: Metadata;
19
19
  updateOne(operations: any): any;
20
20
  save(): any;
21
21
  remove(): any;
22
22
  }
23
+ export interface QueryHelpers<T> {
24
+ then: Promise<T>['then'];
25
+ sort(options: SortOptions): any;
26
+ }
23
27
  export interface MatchMakerDriver {
24
28
  /**
25
29
  * Initialize a room cache which contains CRUD operations for room listings.
@@ -28,7 +32,7 @@ export interface MatchMakerDriver {
28
32
  *
29
33
  * @returns RoomData - New room cache.
30
34
  */
31
- createInstance(initialValues: Partial<IRoomCache>): RoomCache;
35
+ createInstance(initialValues: Partial<IRoomListingData>): RoomListingData;
32
36
  /**
33
37
  * Check if a room exists in room cache.
34
38
  *
@@ -42,9 +46,9 @@ export interface MatchMakerDriver {
42
46
  *
43
47
  * @param conditions - Filtering conditions.
44
48
  *
45
- * @returns Promise<IRoomCache[]> | IRoomCache[] - A promise or an object contaning room metadata list.
49
+ * @returns Promise<RoomListingData[]> | RoomListingData[] - A promise or an object contaning room metadata list.
46
50
  */
47
- query(conditions: Partial<IRoomCache>, sortOptions?: SortOptions): Promise<IRoomCache[]> | IRoomCache[];
51
+ find(conditions: Partial<IRoomListingData>, additionalProjectionFields?: any): Promise<RoomListingData[]> | RoomListingData[];
48
52
  /**
49
53
  * Clean up rooms in room cache by process id.
50
54
  * @param processId - The process id.
@@ -55,9 +59,9 @@ export interface MatchMakerDriver {
55
59
  *
56
60
  * @param conditions - Filtering conditions.
57
61
  *
58
- * @returns `IRoomCache` - An object contaning filtered room metadata.
62
+ * @returns `RoomListingData` - An object contaning filtered room metadata.
59
63
  */
60
- findOne(conditions: Partial<IRoomCache>, sortOptions?: SortOptions): Promise<RoomCache>;
64
+ findOne(conditions: Partial<IRoomListingData>): QueryHelpers<RoomListingData>;
61
65
  /**
62
66
  * Empty the room cache.
63
67
  */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/matchmaker/driver/interfaces.ts"],
4
- "sourcesContent": ["export interface SortOptions {\n [fieldName: string]: 1 | -1 | 'asc' | 'desc' | 'ascending' | 'descending';\n}\n\nexport interface IRoomCache {\n clients: number;\n locked: boolean;\n private: boolean;\n maxClients: number;\n metadata: any;\n name: string;\n publicAddress?: string;\n processId: string;\n roomId: string;\n unlisted: boolean;\n [property: string]: any;\n}\n\nexport interface RoomCache<Metadata= any> extends IRoomCache {\n metadata: Metadata;\n\n updateOne(operations: any);\n save();\n remove();\n}\n\nexport interface MatchMakerDriver {\n\n /**\n * Initialize a room cache which contains CRUD operations for room listings.\n *\n * @param initialValues - Predefined room properties.\n *\n * @returns RoomData - New room cache.\n */\n createInstance(initialValues: Partial<IRoomCache>): RoomCache;\n\n /**\n * Check if a room exists in room cache.\n *\n * @param roomId - The room id.\n *\n * @returns Promise<boolean> | boolean - A promise or a boolean value indicating if the room exists.\n */\n has(roomId: string): Promise<boolean> | boolean;\n\n /**\n * Query rooms in room cache for given conditions.\n *\n * @param conditions - Filtering conditions.\n *\n * @returns Promise<IRoomCache[]> | IRoomCache[] - A promise or an object contaning room metadata list.\n */\n query(conditions: Partial<IRoomCache>, sortOptions?: SortOptions,): Promise<IRoomCache[]> | IRoomCache[];\n\n /**\n * Clean up rooms in room cache by process id.\n * @param processId - The process id.\n */\n cleanup?(processId: string): Promise<void>;\n\n /**\n * Query for a room in room cache for given conditions.\n *\n * @param conditions - Filtering conditions.\n *\n * @returns `IRoomCache` - An object contaning filtered room metadata.\n */\n findOne(conditions: Partial<IRoomCache>, sortOptions?: SortOptions): Promise<RoomCache>;\n\n /**\n * Empty the room cache.\n */\n clear(): void;\n\n /**\n * Dispose the connection of the room cache medium.\n */\n shutdown(): void;\n}\n"],
4
+ "sourcesContent": ["export interface SortOptions { [fieldName: string]: 1 | -1 | 'asc' | 'desc' | 'ascending' | 'descending'; }\n\nexport interface IRoomListingData {\n clients: number;\n locked: boolean;\n private: boolean;\n maxClients: number;\n metadata: any;\n name: string;\n publicAddress?: string;\n processId: string;\n roomId: string;\n unlisted: boolean;\n [property: string]: any;\n}\n\nexport interface RoomListingData<Metadata= any> extends IRoomListingData {\n metadata: Metadata;\n\n updateOne(operations: any);\n save();\n remove();\n}\n\nexport interface QueryHelpers<T> {\n then: Promise<T>['then'];\n sort(options: SortOptions);\n}\n\nexport interface MatchMakerDriver {\n\n /**\n * Initialize a room cache which contains CRUD operations for room listings.\n *\n * @param initialValues - Predefined room properties.\n *\n * @returns RoomData - New room cache.\n */\n createInstance(initialValues: Partial<IRoomListingData>): RoomListingData;\n\n /**\n * Check if a room exists in room cache.\n *\n * @param roomId - The room id.\n *\n * @returns Promise<boolean> | boolean - A promise or a boolean value indicating if the room exists.\n */\n has(roomId: string): Promise<boolean> | boolean;\n\n /**\n * Query rooms in room cache for given conditions.\n *\n * @param conditions - Filtering conditions.\n *\n * @returns Promise<RoomListingData[]> | RoomListingData[] - A promise or an object contaning room metadata list.\n */\n find(\n conditions: Partial<IRoomListingData>,\n additionalProjectionFields?: any,\n ): Promise<RoomListingData[]> | RoomListingData[];\n\n /**\n * Clean up rooms in room cache by process id.\n * @param processId - The process id.\n */\n cleanup?(processId: string): Promise<void>;\n\n /**\n * Query for a room in room cache for given conditions.\n *\n * @param conditions - Filtering conditions.\n *\n * @returns `RoomListingData` - An object contaning filtered room metadata.\n */\n findOne(conditions: Partial<IRoomListingData>): QueryHelpers<RoomListingData>;\n\n /**\n * Empty the room cache.\n */\n clear(): void;\n\n /**\n * Dispose the connection of the room cache medium.\n */\n shutdown(): void;\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * This serializer is a copy of SchemaSerializer,
3
+ * but it writes debug information to a file.
4
+ *
5
+ * This script must be used
6
+ */
7
+ import fs from 'fs';
8
+ import { SchemaSerializer } from './SchemaSerializer.js';
9
+ import { Client } from "../Transport.js";
10
+ export declare class SchemaSerializerDebug<T> extends SchemaSerializer<T> {
11
+ protected debugStream: fs.WriteStream;
12
+ constructor(fileName?: string);
13
+ getFullState(client?: Client): Buffer;
14
+ applyPatches(clients: Client[]): boolean;
15
+ handshake(): Buffer;
16
+ }
@@ -0,0 +1,126 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
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
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var SchemaSerializerDebug_exports = {};
29
+ __export(SchemaSerializerDebug_exports, {
30
+ SchemaSerializerDebug: () => SchemaSerializerDebug
31
+ });
32
+ module.exports = __toCommonJS(SchemaSerializerDebug_exports);
33
+ var import_fs = __toESM(require("fs"));
34
+ var import_schema = require("@colyseus/schema");
35
+ var import_SchemaSerializer = require("./SchemaSerializer.js");
36
+ var import_Transport = require("../Transport.js");
37
+ var import_Protocol = require("../Protocol.js");
38
+ var import_Debug = require("../Debug.js");
39
+ const SHARED_VIEW = {};
40
+ class SchemaSerializerDebug extends import_SchemaSerializer.SchemaSerializer {
41
+ constructor(fileName = "schema-debug.txt") {
42
+ super();
43
+ try {
44
+ import_fs.default.unlinkSync(fileName);
45
+ } catch (e) {
46
+ }
47
+ this.debugStream = import_fs.default.createWriteStream(fileName, { flags: "a" });
48
+ }
49
+ getFullState(client) {
50
+ const buf = super.getFullState(client);
51
+ this.debugStream.write(`state:${client.sessionId}:${Array.from(buf).slice(1).join(",")}
52
+ `);
53
+ return buf;
54
+ }
55
+ applyPatches(clients) {
56
+ let numClients = clients.length;
57
+ const debugChangesDeep = import_schema.Schema.debugChangesDeep(this.encoder.state);
58
+ if (numClients == 0 || this.encoder.root.changes.size === 0 && (!this.hasFilters || this.encoder.root.filteredChanges.size === 0)) {
59
+ return false;
60
+ }
61
+ this.needFullEncode = true;
62
+ if (import_Debug.debugPatch.enabled) {
63
+ import_Debug.debugPatch.dumpChanges = (0, import_schema.dumpChanges)(this.encoder.state);
64
+ }
65
+ const it = { offset: 1 };
66
+ this.encoder.sharedBuffer[0] = import_Protocol.Protocol.ROOM_STATE_PATCH;
67
+ const encodedChanges = this.encoder.encode(it);
68
+ if (!this.hasFilters) {
69
+ while (numClients--) {
70
+ const client = clients[numClients];
71
+ if (client.state !== import_Transport.ClientState.JOINED) {
72
+ continue;
73
+ }
74
+ debugChangesDeep.split("\n").forEach((line) => {
75
+ this.debugStream.write(`#${client.sessionId}:${line}
76
+ `);
77
+ });
78
+ this.debugStream.write(`patch:${client.sessionId}:${Array.from(encodedChanges).slice(1).join(",")}
79
+ `);
80
+ client.raw(encodedChanges);
81
+ }
82
+ } else {
83
+ const sharedOffset = it.offset;
84
+ while (numClients--) {
85
+ const client = clients[numClients];
86
+ if (client.state !== import_Transport.ClientState.JOINED) {
87
+ continue;
88
+ }
89
+ const view = client.view || SHARED_VIEW;
90
+ let encodedView = this.views.get(view);
91
+ if (encodedView === void 0) {
92
+ encodedView = view === SHARED_VIEW ? encodedChanges : this.encoder.encodeView(client.view, sharedOffset, it);
93
+ this.views.set(view, encodedView);
94
+ }
95
+ debugChangesDeep.split("\n").forEach((line) => {
96
+ this.debugStream.write(`#${client.sessionId}:${line}
97
+ `);
98
+ });
99
+ this.debugStream.write(`patch:${client.sessionId}:${Array.from(encodedView).slice(1).join(",")}
100
+ `);
101
+ client.raw(encodedView);
102
+ }
103
+ this.views.clear();
104
+ }
105
+ this.encoder.discardChanges();
106
+ if (import_Debug.debugPatch.enabled) {
107
+ (0, import_Debug.debugPatch)(
108
+ "%d bytes sent to %d clients, %j",
109
+ encodedChanges.length,
110
+ clients.length,
111
+ import_Debug.debugPatch.dumpChanges
112
+ );
113
+ }
114
+ return true;
115
+ }
116
+ handshake() {
117
+ const buf = super.handshake();
118
+ this.debugStream.write(`handshake:${Array.from(buf).join(",")}
119
+ `);
120
+ return buf;
121
+ }
122
+ }
123
+ // Annotate the CommonJS export names for ESM import in node:
124
+ 0 && (module.exports = {
125
+ SchemaSerializerDebug
126
+ });
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/serializer/SchemaSerializerDebug.ts"],
4
+ "sourcesContent": ["/**\n * This serializer is a copy of SchemaSerializer,\n * but it writes debug information to a file.\n *\n * This script must be used\n */\n\nimport fs from 'fs';\nimport { Schema, dumpChanges, Iterator } from '@colyseus/schema';\nimport { SchemaSerializer } from './SchemaSerializer.js';\nimport { Client, ClientState } from \"../Transport.js\";\nimport { Protocol} from '../Protocol.js';\nimport { debugPatch } from '../Debug.js';\n\nconst SHARED_VIEW = {};\n\nexport class SchemaSerializerDebug<T> extends SchemaSerializer<T> {\n protected debugStream: fs.WriteStream;\n\n constructor(fileName: string = \"schema-debug.txt\") {\n super();\n\n try { fs.unlinkSync(fileName); } catch (e) {}\n this.debugStream = fs.createWriteStream(fileName, { flags: \"a\" });\n }\n\n public getFullState(client?: Client): Buffer {\n const buf = super.getFullState(client);\n this.debugStream.write(`state:${client.sessionId}:${Array.from(buf).slice(1).join(\",\")}\\n`);\n return buf;\n }\n\n public applyPatches(clients: Client[]) {\n let numClients = clients.length;\n\n const debugChangesDeep = Schema.debugChangesDeep(this.encoder.state);\n\n if (\n numClients == 0 ||\n (\n this.encoder.root.changes.size === 0 &&\n (!this.hasFilters || this.encoder.root.filteredChanges.size === 0)\n )\n ) {\n // skip patching state if:\n // - no clients are connected\n // - no changes were made\n // - no \"filtered changes\" were made when using filters\n return false;\n }\n\n this.needFullEncode = true;\n\n // dump changes for patch debugging\n if (debugPatch.enabled) {\n (debugPatch as any).dumpChanges = dumpChanges(this.encoder.state);\n }\n\n // get patch bytes\n const it: Iterator = { offset: 1 };\n this.encoder.sharedBuffer[0] = Protocol.ROOM_STATE_PATCH;\n\n // encode changes once, for all clients\n const encodedChanges = this.encoder.encode(it);\n\n if (!this.hasFilters) {\n while (numClients--) {\n const client = clients[numClients];\n\n //\n // FIXME: avoid this check for each client\n //\n if (client.state !== ClientState.JOINED) {\n continue;\n }\n\n debugChangesDeep.split(\"\\n\").forEach((line) => {\n this.debugStream.write(`#${client.sessionId}:${line}\\n`);\n });\n this.debugStream.write(`patch:${client.sessionId}:${Array.from(encodedChanges).slice(1).join(\",\")}\\n`);\n\n client.raw(encodedChanges);\n }\n\n } else {\n // cache shared offset\n const sharedOffset = it.offset;\n\n // encode state multiple times, for each client\n while (numClients--) {\n const client = clients[numClients];\n\n //\n // FIXME: avoid this check for each client\n //\n if (client.state !== ClientState.JOINED) {\n continue;\n }\n\n const view = client.view || SHARED_VIEW;\n\n let encodedView = this.views.get(view);\n\n // allow to pass the same encoded view for multiple clients\n if (encodedView === undefined) {\n encodedView = (view === SHARED_VIEW)\n ? encodedChanges\n : this.encoder.encodeView(client.view, sharedOffset, it);\n this.views.set(view, encodedView);\n }\n\n debugChangesDeep.split(\"\\n\").forEach((line) => {\n this.debugStream.write(`#${client.sessionId}:${line}\\n`);\n });\n this.debugStream.write(`patch:${client.sessionId}:${Array.from(encodedView).slice(1).join(\",\")}\\n`);\n\n client.raw(encodedView);\n }\n\n // clear views\n this.views.clear();\n }\n\n // discard changes after sending\n this.encoder.discardChanges();\n\n // debug patches\n if (debugPatch.enabled) {\n debugPatch(\n '%d bytes sent to %d clients, %j',\n encodedChanges.length,\n clients.length,\n (debugPatch as any).dumpChanges,\n );\n }\n\n return true;\n }\n\n public handshake(): Buffer {\n const buf = super.handshake();\n this.debugStream.write(`handshake:${Array.from(buf).join(\",\")}\\n`);\n return buf;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["fs"]
7
+ }
@@ -0,0 +1,94 @@
1
+ // packages/core/src/serializer/SchemaSerializerDebug.ts
2
+ import fs from "fs";
3
+ import { Schema, dumpChanges } from "@colyseus/schema";
4
+ import { SchemaSerializer } from "./SchemaSerializer.mjs";
5
+ import { ClientState } from "../Transport.mjs";
6
+ import { Protocol } from "../Protocol.mjs";
7
+ import { debugPatch } from "../Debug.mjs";
8
+ var SHARED_VIEW = {};
9
+ var SchemaSerializerDebug = class extends SchemaSerializer {
10
+ constructor(fileName = "schema-debug.txt") {
11
+ super();
12
+ try {
13
+ fs.unlinkSync(fileName);
14
+ } catch (e) {
15
+ }
16
+ this.debugStream = fs.createWriteStream(fileName, { flags: "a" });
17
+ }
18
+ getFullState(client) {
19
+ const buf = super.getFullState(client);
20
+ this.debugStream.write(`state:${client.sessionId}:${Array.from(buf).slice(1).join(",")}
21
+ `);
22
+ return buf;
23
+ }
24
+ applyPatches(clients) {
25
+ let numClients = clients.length;
26
+ const debugChangesDeep = Schema.debugChangesDeep(this.encoder.state);
27
+ if (numClients == 0 || this.encoder.root.changes.size === 0 && (!this.hasFilters || this.encoder.root.filteredChanges.size === 0)) {
28
+ return false;
29
+ }
30
+ this.needFullEncode = true;
31
+ if (debugPatch.enabled) {
32
+ debugPatch.dumpChanges = dumpChanges(this.encoder.state);
33
+ }
34
+ const it = { offset: 1 };
35
+ this.encoder.sharedBuffer[0] = Protocol.ROOM_STATE_PATCH;
36
+ const encodedChanges = this.encoder.encode(it);
37
+ if (!this.hasFilters) {
38
+ while (numClients--) {
39
+ const client = clients[numClients];
40
+ if (client.state !== ClientState.JOINED) {
41
+ continue;
42
+ }
43
+ debugChangesDeep.split("\n").forEach((line) => {
44
+ this.debugStream.write(`#${client.sessionId}:${line}
45
+ `);
46
+ });
47
+ this.debugStream.write(`patch:${client.sessionId}:${Array.from(encodedChanges).slice(1).join(",")}
48
+ `);
49
+ client.raw(encodedChanges);
50
+ }
51
+ } else {
52
+ const sharedOffset = it.offset;
53
+ while (numClients--) {
54
+ const client = clients[numClients];
55
+ if (client.state !== ClientState.JOINED) {
56
+ continue;
57
+ }
58
+ const view = client.view || SHARED_VIEW;
59
+ let encodedView = this.views.get(view);
60
+ if (encodedView === void 0) {
61
+ encodedView = view === SHARED_VIEW ? encodedChanges : this.encoder.encodeView(client.view, sharedOffset, it);
62
+ this.views.set(view, encodedView);
63
+ }
64
+ debugChangesDeep.split("\n").forEach((line) => {
65
+ this.debugStream.write(`#${client.sessionId}:${line}
66
+ `);
67
+ });
68
+ this.debugStream.write(`patch:${client.sessionId}:${Array.from(encodedView).slice(1).join(",")}
69
+ `);
70
+ client.raw(encodedView);
71
+ }
72
+ this.views.clear();
73
+ }
74
+ this.encoder.discardChanges();
75
+ if (debugPatch.enabled) {
76
+ debugPatch(
77
+ "%d bytes sent to %d clients, %j",
78
+ encodedChanges.length,
79
+ clients.length,
80
+ debugPatch.dumpChanges
81
+ );
82
+ }
83
+ return true;
84
+ }
85
+ handshake() {
86
+ const buf = super.handshake();
87
+ this.debugStream.write(`handshake:${Array.from(buf).join(",")}
88
+ `);
89
+ return buf;
90
+ }
91
+ };
92
+ export {
93
+ SchemaSerializerDebug
94
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/serializer/SchemaSerializerDebug.ts"],
4
+ "sourcesContent": ["/**\n * This serializer is a copy of SchemaSerializer,\n * but it writes debug information to a file.\n *\n * This script must be used\n */\n\nimport fs from 'fs';\nimport { Schema, dumpChanges, Iterator } from '@colyseus/schema';\nimport { SchemaSerializer } from './SchemaSerializer.js';\nimport { Client, ClientState } from \"../Transport.js\";\nimport { Protocol} from '../Protocol.js';\nimport { debugPatch } from '../Debug.js';\n\nconst SHARED_VIEW = {};\n\nexport class SchemaSerializerDebug<T> extends SchemaSerializer<T> {\n protected debugStream: fs.WriteStream;\n\n constructor(fileName: string = \"schema-debug.txt\") {\n super();\n\n try { fs.unlinkSync(fileName); } catch (e) {}\n this.debugStream = fs.createWriteStream(fileName, { flags: \"a\" });\n }\n\n public getFullState(client?: Client): Buffer {\n const buf = super.getFullState(client);\n this.debugStream.write(`state:${client.sessionId}:${Array.from(buf).slice(1).join(\",\")}\\n`);\n return buf;\n }\n\n public applyPatches(clients: Client[]) {\n let numClients = clients.length;\n\n const debugChangesDeep = Schema.debugChangesDeep(this.encoder.state);\n\n if (\n numClients == 0 ||\n (\n this.encoder.root.changes.size === 0 &&\n (!this.hasFilters || this.encoder.root.filteredChanges.size === 0)\n )\n ) {\n // skip patching state if:\n // - no clients are connected\n // - no changes were made\n // - no \"filtered changes\" were made when using filters\n return false;\n }\n\n this.needFullEncode = true;\n\n // dump changes for patch debugging\n if (debugPatch.enabled) {\n (debugPatch as any).dumpChanges = dumpChanges(this.encoder.state);\n }\n\n // get patch bytes\n const it: Iterator = { offset: 1 };\n this.encoder.sharedBuffer[0] = Protocol.ROOM_STATE_PATCH;\n\n // encode changes once, for all clients\n const encodedChanges = this.encoder.encode(it);\n\n if (!this.hasFilters) {\n while (numClients--) {\n const client = clients[numClients];\n\n //\n // FIXME: avoid this check for each client\n //\n if (client.state !== ClientState.JOINED) {\n continue;\n }\n\n debugChangesDeep.split(\"\\n\").forEach((line) => {\n this.debugStream.write(`#${client.sessionId}:${line}\\n`);\n });\n this.debugStream.write(`patch:${client.sessionId}:${Array.from(encodedChanges).slice(1).join(\",\")}\\n`);\n\n client.raw(encodedChanges);\n }\n\n } else {\n // cache shared offset\n const sharedOffset = it.offset;\n\n // encode state multiple times, for each client\n while (numClients--) {\n const client = clients[numClients];\n\n //\n // FIXME: avoid this check for each client\n //\n if (client.state !== ClientState.JOINED) {\n continue;\n }\n\n const view = client.view || SHARED_VIEW;\n\n let encodedView = this.views.get(view);\n\n // allow to pass the same encoded view for multiple clients\n if (encodedView === undefined) {\n encodedView = (view === SHARED_VIEW)\n ? encodedChanges\n : this.encoder.encodeView(client.view, sharedOffset, it);\n this.views.set(view, encodedView);\n }\n\n debugChangesDeep.split(\"\\n\").forEach((line) => {\n this.debugStream.write(`#${client.sessionId}:${line}\\n`);\n });\n this.debugStream.write(`patch:${client.sessionId}:${Array.from(encodedView).slice(1).join(\",\")}\\n`);\n\n client.raw(encodedView);\n }\n\n // clear views\n this.views.clear();\n }\n\n // discard changes after sending\n this.encoder.discardChanges();\n\n // debug patches\n if (debugPatch.enabled) {\n debugPatch(\n '%d bytes sent to %d clients, %j',\n encodedChanges.length,\n clients.length,\n (debugPatch as any).dumpChanges,\n );\n }\n\n return true;\n }\n\n public handshake(): Buffer {\n const buf = super.handshake();\n this.debugStream.write(`handshake:${Array.from(buf).join(\",\")}\\n`);\n return buf;\n }\n}\n"],
5
+ "mappings": ";AAOA,OAAO,QAAQ;AACf,SAAS,QAAQ,mBAA6B;AAC9C,SAAS,wBAAwB;AACjC,SAAiB,mBAAoB;AACrC,SAAS,gBAAe;AACxB,SAAS,kBAAkB;AAE3B,IAAM,cAAc,CAAC;AAEd,IAAM,wBAAN,cAAuC,iBAAoB;AAAA,EAGhE,YAAY,WAAmB,oBAAoB;AACjD,UAAM;AAEN,QAAI;AAAE,SAAG,WAAW,QAAQ;AAAA,IAAG,SAAS,GAAG;AAAA,IAAC;AAC5C,SAAK,cAAc,GAAG,kBAAkB,UAAU,EAAE,OAAO,IAAI,CAAC;AAAA,EAClE;AAAA,EAEO,aAAa,QAAyB;AAC3C,UAAM,MAAM,MAAM,aAAa,MAAM;AACrC,SAAK,YAAY,MAAM,SAAS,OAAO,SAAS,IAAI,MAAM,KAAK,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,CAAI;AAC1F,WAAO;AAAA,EACT;AAAA,EAEO,aAAa,SAAmB;AACrC,QAAI,aAAa,QAAQ;AAEzB,UAAM,mBAAmB,OAAO,iBAAiB,KAAK,QAAQ,KAAK;AAEnE,QACE,cAAc,KAEZ,KAAK,QAAQ,KAAK,QAAQ,SAAS,MAClC,CAAC,KAAK,cAAc,KAAK,QAAQ,KAAK,gBAAgB,SAAS,IAElE;AAKA,aAAO;AAAA,IACT;AAEA,SAAK,iBAAiB;AAGtB,QAAI,WAAW,SAAS;AACtB,MAAC,WAAmB,cAAc,YAAY,KAAK,QAAQ,KAAK;AAAA,IAClE;AAGA,UAAM,KAAe,EAAE,QAAQ,EAAE;AACjC,SAAK,QAAQ,aAAa,CAAC,IAAI,SAAS;AAGxC,UAAM,iBAAiB,KAAK,QAAQ,OAAO,EAAE;AAE7C,QAAI,CAAC,KAAK,YAAY;AACpB,aAAO,cAAc;AACnB,cAAM,SAAS,QAAQ,UAAU;AAKjC,YAAI,OAAO,UAAU,YAAY,QAAQ;AACvC;AAAA,QACF;AAEA,yBAAiB,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS;AAC7C,eAAK,YAAY,MAAM,IAAI,OAAO,SAAS,IAAI,IAAI;AAAA,CAAI;AAAA,QACzD,CAAC;AACD,aAAK,YAAY,MAAM,SAAS,OAAO,SAAS,IAAI,MAAM,KAAK,cAAc,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,CAAI;AAErG,eAAO,IAAI,cAAc;AAAA,MAC3B;AAAA,IAEF,OAAO;AAEL,YAAM,eAAe,GAAG;AAGxB,aAAO,cAAc;AACnB,cAAM,SAAS,QAAQ,UAAU;AAKjC,YAAI,OAAO,UAAU,YAAY,QAAQ;AACvC;AAAA,QACF;AAEA,cAAM,OAAO,OAAO,QAAQ;AAE5B,YAAI,cAAc,KAAK,MAAM,IAAI,IAAI;AAGrC,YAAI,gBAAgB,QAAW;AAC7B,wBAAe,SAAS,cACpB,iBACA,KAAK,QAAQ,WAAW,OAAO,MAAM,cAAc,EAAE;AACzD,eAAK,MAAM,IAAI,MAAM,WAAW;AAAA,QAClC;AAEA,yBAAiB,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS;AAC7C,eAAK,YAAY,MAAM,IAAI,OAAO,SAAS,IAAI,IAAI;AAAA,CAAI;AAAA,QACzD,CAAC;AACD,aAAK,YAAY,MAAM,SAAS,OAAO,SAAS,IAAI,MAAM,KAAK,WAAW,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,CAAI;AAElG,eAAO,IAAI,WAAW;AAAA,MACxB;AAGA,WAAK,MAAM,MAAM;AAAA,IACnB;AAGA,SAAK,QAAQ,eAAe;AAG5B,QAAI,WAAW,SAAS;AACtB;AAAA,QACE;AAAA,QACA,eAAe;AAAA,QACf,QAAQ;AAAA,QACP,WAAmB;AAAA,MACtB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,YAAoB;AACzB,UAAM,MAAM,MAAM,UAAU;AAC5B,SAAK,YAAY,MAAM,aAAa,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG,CAAC;AAAA,CAAI;AACjE,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colyseus/core",
3
- "version": "0.16.0-preview.32",
3
+ "version": "0.16.0-preview.34",
4
4
  "description": "Multiplayer Framework for Node.js.",
5
5
  "input": "./src/index.ts",
6
6
  "main": "./build/index.js",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@colyseus/greeting-banner": "^2.0.0",
41
- "@colyseus/schema": "^3.0.0-alpha.0",
41
+ "@colyseus/schema": "^3.0.0-alpha.37",
42
42
  "@colyseus/timer": "^1.0.0",
43
43
  "debug": "^4.3.4",
44
44
  "@colyseus/msgpackr": "^1.10.3",