@colyseus/core 0.15.1 → 0.15.3
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/Room.d.ts +3 -3
- package/build/Room.js +6 -6
- package/build/Room.js.map +2 -2
- package/build/Room.mjs +8 -8
- package/build/Room.mjs.map +2 -2
- package/build/Transport.d.ts +6 -2
- package/build/Transport.js +11 -0
- package/build/Transport.js.map +3 -3
- package/build/Transport.mjs +10 -0
- package/build/Transport.mjs.map +2 -2
- package/build/index.d.ts +2 -2
- package/build/index.js +2 -2
- package/build/index.js.map +2 -2
- package/build/index.mjs +3 -3
- package/build/index.mjs.map +2 -2
- package/build/presence/LocalPresence.d.ts +1 -0
- package/build/presence/LocalPresence.js +3 -0
- package/build/presence/LocalPresence.js.map +2 -2
- package/build/presence/LocalPresence.mjs +3 -0
- package/build/presence/LocalPresence.mjs.map +2 -2
- package/build/presence/Presence.d.ts +7 -0
- package/build/presence/Presence.js.map +1 -1
- package/build/utils/Utils.d.ts +0 -25
- package/build/utils/Utils.js +0 -114
- package/build/utils/Utils.js.map +2 -2
- package/build/utils/Utils.mjs +0 -113
- package/build/utils/Utils.mjs.map +2 -2
- package/package.json +2 -2
package/build/Transport.js
CHANGED
|
@@ -17,10 +17,12 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
18
|
var Transport_exports = {};
|
|
19
19
|
__export(Transport_exports, {
|
|
20
|
+
ClientArray: () => ClientArray,
|
|
20
21
|
ClientState: () => ClientState,
|
|
21
22
|
Transport: () => Transport
|
|
22
23
|
});
|
|
23
24
|
module.exports = __toCommonJS(Transport_exports);
|
|
25
|
+
var import_Utils2 = require("./Utils");
|
|
24
26
|
class Transport {
|
|
25
27
|
server;
|
|
26
28
|
}
|
|
@@ -31,8 +33,17 @@ var ClientState = /* @__PURE__ */ ((ClientState2) => {
|
|
|
31
33
|
ClientState2[ClientState2["LEAVING"] = 3] = "LEAVING";
|
|
32
34
|
return ClientState2;
|
|
33
35
|
})(ClientState || {});
|
|
36
|
+
class ClientArray extends Array {
|
|
37
|
+
getById(sessionId) {
|
|
38
|
+
return this.find((client) => client.sessionId === sessionId);
|
|
39
|
+
}
|
|
40
|
+
delete(client) {
|
|
41
|
+
return (0, import_Utils2.spliceOne)(this, this.indexOf(client));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
34
44
|
// Annotate the CommonJS export names for ESM import in node:
|
|
35
45
|
0 && (module.exports = {
|
|
46
|
+
ClientArray,
|
|
36
47
|
ClientState,
|
|
37
48
|
Transport
|
|
38
49
|
});
|
package/build/Transport.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/Transport.ts"],
|
|
4
|
-
"sourcesContent": ["import * as http from 'http';\nimport * as https from 'https';\nimport * as net from 'net';\n\nimport { Schema } from '@colyseus/schema';\nimport { EventEmitter } from 'events';\nimport { DummyServer } from './utils/Utils';\n\nexport abstract class Transport {\n public server?: net.Server | http.Server | https.Server | DummyServer;\n\n public abstract listen(port?: number, hostname?: string, backlog?: number, listeningListener?: Function): this;\n public abstract shutdown(): void;\n\n public abstract simulateLatency(milliseconds: number): void;\n}\n\nexport interface ISendOptions {\n afterNextPatch?: boolean;\n}\n\nexport enum ClientState { JOINING, JOINED, RECONNECTED, LEAVING }\n\n/**\n * The client instance from the server-side is responsible for the transport layer between the server and the client.\n * It should not be confused with the Client from the client-side SDK, as they have completely different purposes!\n * You operate on client instances from `this.clients`, `Room#onJoin()`, `Room#onLeave()` and `Room#onMessage()`.\n *\n * - This is the raw WebSocket connection coming from the `ws` package. There are more methods available which aren't\n * encouraged to use along with Colyseus.\n */\nexport interface Client {\n readyState: number;\n\n id: string;\n /**\n * Unique id per session.\n */\n sessionId: string; // TODO: remove sessionId on version 1.0.0\n state: ClientState;\n\n ref: EventEmitter;\n\n upgradeReq?: http.IncomingMessage; // cross-compatibility for ws (v3.x+) and uws\n\n /**\n * User-defined data can be attached to the Client instance through this variable.\n * - Can be used to store custom data about the client's connection. userData is not synchronized with the client,\n * and should be used only to keep player-specific with its connection.\n */\n userData?:
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
6
|
-
"names": ["ClientState"]
|
|
4
|
+
"sourcesContent": ["import * as http from 'http';\nimport * as https from 'https';\nimport * as net from 'net';\n\nimport { Schema } from '@colyseus/schema';\nimport { EventEmitter } from 'events';\nimport { DummyServer } from './utils/Utils';\nimport { spliceOne } from './Utils';\n\nexport abstract class Transport {\n public server?: net.Server | http.Server | https.Server | DummyServer;\n\n public abstract listen(port?: number, hostname?: string, backlog?: number, listeningListener?: Function): this;\n public abstract shutdown(): void;\n\n public abstract simulateLatency(milliseconds: number): void;\n}\n\nexport interface ISendOptions {\n afterNextPatch?: boolean;\n}\n\nexport enum ClientState { JOINING, JOINED, RECONNECTED, LEAVING }\n\n/**\n * The client instance from the server-side is responsible for the transport layer between the server and the client.\n * It should not be confused with the Client from the client-side SDK, as they have completely different purposes!\n * You operate on client instances from `this.clients`, `Room#onJoin()`, `Room#onLeave()` and `Room#onMessage()`.\n *\n * - This is the raw WebSocket connection coming from the `ws` package. There are more methods available which aren't\n * encouraged to use along with Colyseus.\n */\nexport interface Client<UserData=any> {\n readyState: number;\n\n id: string;\n /**\n * Unique id per session.\n */\n sessionId: string; // TODO: remove sessionId on version 1.0.0\n state: ClientState;\n\n ref: EventEmitter;\n\n upgradeReq?: http.IncomingMessage; // cross-compatibility for ws (v3.x+) and uws\n\n /**\n * User-defined data can be attached to the Client instance through this variable.\n * - Can be used to store custom data about the client's connection. userData is not synchronized with the client,\n * and should be used only to keep player-specific with its connection.\n */\n userData?: UserData;\n\n /**\n * auth data provided by your `onAuth`\n */\n auth?: any;\n pingCount?: number; // ping / pong\n\n _reconnectionToken: string;\n _enqueuedMessages?: any[];\n _afterNextPatchQueue: Array<[string | Client, IArguments]>;\n\n raw(data: ArrayLike<number>, options?: ISendOptions, cb?: (err?: Error) => void): void;\n enqueueRaw(data: ArrayLike<number>, options?: ISendOptions): void;\n\n /**\n * Send a type of message to the client. Messages are encoded with MsgPack and can hold any\n * JSON-serializable data structure.\n *\n * @param type String or Number identifier the client SDK will use to receive this message\n * @param message Message payload. (automatically encoded with msgpack.)\n * @param options\n */\n send(type: string | number, message?: any, options?: ISendOptions): void;\n send(message: Schema, options?: ISendOptions): void;\n\n /**\n * Send raw bytes to this specific client.\n *\n * @param type String or Number identifier the client SDK will use to receive this message\n * @param bytes Raw byte array payload\n * @param options\n */\n sendBytes(type: string | number, bytes: number[] | Uint8Array, options?: ISendOptions): void;\n\n /**\n * Disconnect this client from the room.\n *\n * @param code Custom close code. Default value is 1000.\n * @param data\n * @see {@link https://docs.colyseus.io/colyseus/server/room/#leavecode-number}\n */\n leave(code?: number, data?: string): void;\n\n /**\n * @deprecated Use .leave() instead.\n */\n close(code?: number, data?: string): void;\n\n /**\n * Triggers `onError` with specified code to the client-side.\n *\n * @param code\n * @param message\n */\n error(code: number, message?: string): void;\n}\n\nexport class ClientArray<UserData> extends Array<Client<UserData>> {\n public getById(sessionId: string): Client<UserData> | undefined {\n return this.find((client) => client.sessionId === sessionId);\n }\n\n public delete(client: Client<UserData>): boolean {\n return spliceOne(this, this.indexOf(client));\n }\n}"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,IAAAA,gBAA0B;AAEnB,MAAe,UAAU;AAAA,EACrB;AAMX;AAMO,IAAK,cAAL,kBAAKC,iBAAL;AAAmB,EAAAA,0BAAA;AAAS,EAAAA,0BAAA;AAAQ,EAAAA,0BAAA;AAAa,EAAAA,0BAAA;AAA5C,SAAAA;AAAA,GAAA;AAuFL,MAAM,oBAA8B,MAAwB;AAAA,EAC1D,QAAQ,WAAiD;AAC9D,WAAO,KAAK,KAAK,CAAC,WAAW,OAAO,cAAc,SAAS;AAAA,EAC7D;AAAA,EAEO,OAAO,QAAmC;AAC/C,eAAO,yBAAU,MAAM,KAAK,QAAQ,MAAM,CAAC;AAAA,EAC7C;AACF;",
|
|
6
|
+
"names": ["import_Utils", "ClientState"]
|
|
7
7
|
}
|
package/build/Transport.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { spliceOne } from "./Utils";
|
|
1
2
|
class Transport {
|
|
2
3
|
server;
|
|
3
4
|
}
|
|
@@ -8,7 +9,16 @@ var ClientState = /* @__PURE__ */ ((ClientState2) => {
|
|
|
8
9
|
ClientState2[ClientState2["LEAVING"] = 3] = "LEAVING";
|
|
9
10
|
return ClientState2;
|
|
10
11
|
})(ClientState || {});
|
|
12
|
+
class ClientArray extends Array {
|
|
13
|
+
getById(sessionId) {
|
|
14
|
+
return this.find((client) => client.sessionId === sessionId);
|
|
15
|
+
}
|
|
16
|
+
delete(client) {
|
|
17
|
+
return spliceOne(this, this.indexOf(client));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
11
20
|
export {
|
|
21
|
+
ClientArray,
|
|
12
22
|
ClientState,
|
|
13
23
|
Transport
|
|
14
24
|
};
|
package/build/Transport.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/Transport.ts"],
|
|
4
|
-
"sourcesContent": ["import * as http from 'http';\nimport * as https from 'https';\nimport * as net from 'net';\n\nimport { Schema } from '@colyseus/schema';\nimport { EventEmitter } from 'events';\nimport { DummyServer } from './utils/Utils';\n\nexport abstract class Transport {\n public server?: net.Server | http.Server | https.Server | DummyServer;\n\n public abstract listen(port?: number, hostname?: string, backlog?: number, listeningListener?: Function): this;\n public abstract shutdown(): void;\n\n public abstract simulateLatency(milliseconds: number): void;\n}\n\nexport interface ISendOptions {\n afterNextPatch?: boolean;\n}\n\nexport enum ClientState { JOINING, JOINED, RECONNECTED, LEAVING }\n\n/**\n * The client instance from the server-side is responsible for the transport layer between the server and the client.\n * It should not be confused with the Client from the client-side SDK, as they have completely different purposes!\n * You operate on client instances from `this.clients`, `Room#onJoin()`, `Room#onLeave()` and `Room#onMessage()`.\n *\n * - This is the raw WebSocket connection coming from the `ws` package. There are more methods available which aren't\n * encouraged to use along with Colyseus.\n */\nexport interface Client {\n readyState: number;\n\n id: string;\n /**\n * Unique id per session.\n */\n sessionId: string; // TODO: remove sessionId on version 1.0.0\n state: ClientState;\n\n ref: EventEmitter;\n\n upgradeReq?: http.IncomingMessage; // cross-compatibility for ws (v3.x+) and uws\n\n /**\n * User-defined data can be attached to the Client instance through this variable.\n * - Can be used to store custom data about the client's connection. userData is not synchronized with the client,\n * and should be used only to keep player-specific with its connection.\n */\n userData?:
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import * as http from 'http';\nimport * as https from 'https';\nimport * as net from 'net';\n\nimport { Schema } from '@colyseus/schema';\nimport { EventEmitter } from 'events';\nimport { DummyServer } from './utils/Utils';\nimport { spliceOne } from './Utils';\n\nexport abstract class Transport {\n public server?: net.Server | http.Server | https.Server | DummyServer;\n\n public abstract listen(port?: number, hostname?: string, backlog?: number, listeningListener?: Function): this;\n public abstract shutdown(): void;\n\n public abstract simulateLatency(milliseconds: number): void;\n}\n\nexport interface ISendOptions {\n afterNextPatch?: boolean;\n}\n\nexport enum ClientState { JOINING, JOINED, RECONNECTED, LEAVING }\n\n/**\n * The client instance from the server-side is responsible for the transport layer between the server and the client.\n * It should not be confused with the Client from the client-side SDK, as they have completely different purposes!\n * You operate on client instances from `this.clients`, `Room#onJoin()`, `Room#onLeave()` and `Room#onMessage()`.\n *\n * - This is the raw WebSocket connection coming from the `ws` package. There are more methods available which aren't\n * encouraged to use along with Colyseus.\n */\nexport interface Client<UserData=any> {\n readyState: number;\n\n id: string;\n /**\n * Unique id per session.\n */\n sessionId: string; // TODO: remove sessionId on version 1.0.0\n state: ClientState;\n\n ref: EventEmitter;\n\n upgradeReq?: http.IncomingMessage; // cross-compatibility for ws (v3.x+) and uws\n\n /**\n * User-defined data can be attached to the Client instance through this variable.\n * - Can be used to store custom data about the client's connection. userData is not synchronized with the client,\n * and should be used only to keep player-specific with its connection.\n */\n userData?: UserData;\n\n /**\n * auth data provided by your `onAuth`\n */\n auth?: any;\n pingCount?: number; // ping / pong\n\n _reconnectionToken: string;\n _enqueuedMessages?: any[];\n _afterNextPatchQueue: Array<[string | Client, IArguments]>;\n\n raw(data: ArrayLike<number>, options?: ISendOptions, cb?: (err?: Error) => void): void;\n enqueueRaw(data: ArrayLike<number>, options?: ISendOptions): void;\n\n /**\n * Send a type of message to the client. Messages are encoded with MsgPack and can hold any\n * JSON-serializable data structure.\n *\n * @param type String or Number identifier the client SDK will use to receive this message\n * @param message Message payload. (automatically encoded with msgpack.)\n * @param options\n */\n send(type: string | number, message?: any, options?: ISendOptions): void;\n send(message: Schema, options?: ISendOptions): void;\n\n /**\n * Send raw bytes to this specific client.\n *\n * @param type String or Number identifier the client SDK will use to receive this message\n * @param bytes Raw byte array payload\n * @param options\n */\n sendBytes(type: string | number, bytes: number[] | Uint8Array, options?: ISendOptions): void;\n\n /**\n * Disconnect this client from the room.\n *\n * @param code Custom close code. Default value is 1000.\n * @param data\n * @see {@link https://docs.colyseus.io/colyseus/server/room/#leavecode-number}\n */\n leave(code?: number, data?: string): void;\n\n /**\n * @deprecated Use .leave() instead.\n */\n close(code?: number, data?: string): void;\n\n /**\n * Triggers `onError` with specified code to the client-side.\n *\n * @param code\n * @param message\n */\n error(code: number, message?: string): void;\n}\n\nexport class ClientArray<UserData> extends Array<Client<UserData>> {\n public getById(sessionId: string): Client<UserData> | undefined {\n return this.find((client) => client.sessionId === sessionId);\n }\n\n public delete(client: Client<UserData>): boolean {\n return spliceOne(this, this.indexOf(client));\n }\n}"],
|
|
5
|
+
"mappings": "AAOA,SAAS,iBAAiB;AAEnB,MAAe,UAAU;AAAA,EACrB;AAMX;AAMO,IAAK,cAAL,kBAAKA,iBAAL;AAAmB,EAAAA,0BAAA;AAAS,EAAAA,0BAAA;AAAQ,EAAAA,0BAAA;AAAa,EAAAA,0BAAA;AAA5C,SAAAA;AAAA,GAAA;AAuFL,MAAM,oBAA8B,MAAwB;AAAA,EAC1D,QAAQ,WAAiD;AAC9D,WAAO,KAAK,KAAK,CAAC,WAAW,OAAO,cAAc,SAAS;AAAA,EAC7D;AAAA,EAEO,OAAO,QAAmC;AAC/C,WAAO,UAAU,MAAM,KAAK,QAAQ,MAAM,CAAC;AAAA,EAC7C;AACF;",
|
|
6
6
|
"names": ["ClientState"]
|
|
7
7
|
}
|
package/build/index.d.ts
CHANGED
|
@@ -8,13 +8,13 @@ import * as matchMaker from './MatchMaker';
|
|
|
8
8
|
export { matchMaker };
|
|
9
9
|
export { updateLobby, subscribeLobby } from './matchmaker/Lobby';
|
|
10
10
|
export * from './matchmaker/driver';
|
|
11
|
-
export { Client, ClientState, Transport, ISendOptions } from './Transport';
|
|
11
|
+
export { Client, ClientState, ClientArray, Transport, ISendOptions } from './Transport';
|
|
12
12
|
export { Presence } from './presence/Presence';
|
|
13
13
|
export { LocalPresence } from './presence/LocalPresence';
|
|
14
14
|
export { Serializer } from './serializer/Serializer';
|
|
15
15
|
export { SchemaSerializer } from './serializer/SchemaSerializer';
|
|
16
16
|
export { Clock, Delayed };
|
|
17
|
-
export { generateId, Deferred, DummyServer, spliceOne
|
|
17
|
+
export { generateId, Deferred, DummyServer, spliceOne } from './utils/Utils';
|
|
18
18
|
export { isDevMode } from './utils/DevMode';
|
|
19
19
|
export { debugMatchMaking, debugMessage, debugPatch, debugError, debugConnection, debugDriver, debugPresence, debugAndPrintError, } from './Debug';
|
|
20
20
|
export { LobbyRoom } from './rooms/LobbyRoom';
|
package/build/index.js
CHANGED
|
@@ -25,13 +25,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
25
25
|
var src_exports = {};
|
|
26
26
|
__export(src_exports, {
|
|
27
27
|
Client: () => import_Transport.Client,
|
|
28
|
+
ClientArray: () => import_Transport.ClientArray,
|
|
28
29
|
ClientState: () => import_Transport.ClientState,
|
|
29
30
|
Clock: () => import_timer.default,
|
|
30
31
|
Deferred: () => import_Utils.Deferred,
|
|
31
32
|
Delayed: () => import_timer.Delayed,
|
|
32
33
|
DummyServer: () => import_Utils.DummyServer,
|
|
33
34
|
ErrorCode: () => import_Protocol.ErrorCode,
|
|
34
|
-
HybridArray: () => import_Utils.HybridArray,
|
|
35
35
|
ISendOptions: () => import_Transport.ISendOptions,
|
|
36
36
|
LobbyRoom: () => import_LobbyRoom.LobbyRoom,
|
|
37
37
|
LocalPresence: () => import_LocalPresence.LocalPresence,
|
|
@@ -88,13 +88,13 @@ var import_Logger = require("./Logger");
|
|
|
88
88
|
// Annotate the CommonJS export names for ESM import in node:
|
|
89
89
|
0 && (module.exports = {
|
|
90
90
|
Client,
|
|
91
|
+
ClientArray,
|
|
91
92
|
ClientState,
|
|
92
93
|
Clock,
|
|
93
94
|
Deferred,
|
|
94
95
|
Delayed,
|
|
95
96
|
DummyServer,
|
|
96
97
|
ErrorCode,
|
|
97
|
-
HybridArray,
|
|
98
98
|
ISendOptions,
|
|
99
99
|
LobbyRoom,
|
|
100
100
|
LocalPresence,
|
package/build/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import Clock, { Delayed } from '@gamestdio/timer';\n\n// Core classes\nexport { Server, ServerOptions } from './Server';\nexport { Room, RoomInternalState } from './Room';\nexport { Protocol, ErrorCode, getMessageBytes } from './Protocol';\nexport { RegisteredHandler } from './matchmaker/RegisteredHandler';\nexport { ServerError } from './errors/ServerError';\n\n// MatchMaker\nimport * as matchMaker from './MatchMaker';\nexport { matchMaker };\nexport { updateLobby, subscribeLobby } from './matchmaker/Lobby';\n\n// Driver\nexport * from './matchmaker/driver';\n\n// Transport\nexport { Client, ClientState, Transport, ISendOptions } from './Transport';\n\n// Presence\nexport { Presence } from './presence/Presence';\nexport { LocalPresence } from './presence/LocalPresence';\n\n// Serializers\nexport { Serializer } from './serializer/Serializer';\nexport { SchemaSerializer } from './serializer/SchemaSerializer';\n\n// Utilities\nexport { Clock, Delayed };\nexport { generateId, Deferred, DummyServer, spliceOne
|
|
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
|
|
4
|
+
"sourcesContent": ["import Clock, { Delayed } from '@gamestdio/timer';\n\n// Core classes\nexport { Server, ServerOptions } from './Server';\nexport { Room, RoomInternalState } from './Room';\nexport { Protocol, ErrorCode, getMessageBytes } from './Protocol';\nexport { RegisteredHandler } from './matchmaker/RegisteredHandler';\nexport { ServerError } from './errors/ServerError';\n\n// MatchMaker\nimport * as matchMaker from './MatchMaker';\nexport { matchMaker };\nexport { updateLobby, subscribeLobby } from './matchmaker/Lobby';\n\n// Driver\nexport * from './matchmaker/driver';\n\n// Transport\nexport { Client, ClientState, ClientArray, Transport, ISendOptions } from './Transport';\n\n// Presence\nexport { Presence } from './presence/Presence';\nexport { LocalPresence } from './presence/LocalPresence';\n\n// Serializers\nexport { Serializer } from './serializer/Serializer';\nexport { SchemaSerializer } from './serializer/SchemaSerializer';\n\n// Utilities\nexport { Clock, Delayed };\nexport { generateId, Deferred, DummyServer, spliceOne } from './utils/Utils';\nexport { isDevMode } from './utils/DevMode';\n\n// Debug\nexport {\n debugMatchMaking,\n debugMessage,\n debugPatch,\n debugError,\n debugConnection,\n debugDriver,\n debugPresence,\n debugAndPrintError,\n} from './Debug';\n\n// Default rooms\nexport { LobbyRoom } from './rooms/LobbyRoom';\nexport { RelayRoom } from './rooms/RelayRoom';\n\n// Abstract logging support\nexport { logger } from './Logger'\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;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,oBAAsC;AACtC,kBAAwC;AACxC,sBAAqD;AACrD,+BAAkC;AAClC,yBAA4B;AAG5B,iBAA4B;AAE5B,mBAA4C;AAG5C,wBAAc,gCAfd;AAkBA,uBAA0E;AAG1E,sBAAyB;AACzB,2BAA8B;AAG9B,wBAA2B;AAC3B,8BAAiC;AAIjC,mBAA6D;AAC7D,qBAA0B;AAG1B,mBASO;AAGP,uBAA0B;AAC1B,uBAA0B;AAG1B,oBAAuB;",
|
|
6
6
|
"names": ["Clock"]
|
|
7
7
|
}
|
package/build/index.mjs
CHANGED
|
@@ -7,12 +7,12 @@ import { ServerError } from "./errors/ServerError";
|
|
|
7
7
|
import * as matchMaker from "./MatchMaker";
|
|
8
8
|
import { updateLobby, subscribeLobby } from "./matchmaker/Lobby";
|
|
9
9
|
export * from "./matchmaker/driver";
|
|
10
|
-
import { Client, ClientState, Transport, ISendOptions } from "./Transport";
|
|
10
|
+
import { Client, ClientState, ClientArray, Transport, ISendOptions } from "./Transport";
|
|
11
11
|
import { Presence } from "./presence/Presence";
|
|
12
12
|
import { LocalPresence } from "./presence/LocalPresence";
|
|
13
13
|
import { Serializer } from "./serializer/Serializer";
|
|
14
14
|
import { SchemaSerializer } from "./serializer/SchemaSerializer";
|
|
15
|
-
import { generateId, Deferred, DummyServer, spliceOne
|
|
15
|
+
import { generateId, Deferred, DummyServer, spliceOne } from "./utils/Utils";
|
|
16
16
|
import { isDevMode } from "./utils/DevMode";
|
|
17
17
|
import {
|
|
18
18
|
debugMatchMaking,
|
|
@@ -29,13 +29,13 @@ import { RelayRoom } from "./rooms/RelayRoom";
|
|
|
29
29
|
import { logger } from "./Logger";
|
|
30
30
|
export {
|
|
31
31
|
Client,
|
|
32
|
+
ClientArray,
|
|
32
33
|
ClientState,
|
|
33
34
|
Clock,
|
|
34
35
|
Deferred,
|
|
35
36
|
Delayed,
|
|
36
37
|
DummyServer,
|
|
37
38
|
ErrorCode,
|
|
38
|
-
HybridArray,
|
|
39
39
|
ISendOptions,
|
|
40
40
|
LobbyRoom,
|
|
41
41
|
LocalPresence,
|
package/build/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import Clock, { Delayed } from '@gamestdio/timer';\n\n// Core classes\nexport { Server, ServerOptions } from './Server';\nexport { Room, RoomInternalState } from './Room';\nexport { Protocol, ErrorCode, getMessageBytes } from './Protocol';\nexport { RegisteredHandler } from './matchmaker/RegisteredHandler';\nexport { ServerError } from './errors/ServerError';\n\n// MatchMaker\nimport * as matchMaker from './MatchMaker';\nexport { matchMaker };\nexport { updateLobby, subscribeLobby } from './matchmaker/Lobby';\n\n// Driver\nexport * from './matchmaker/driver';\n\n// Transport\nexport { Client, ClientState, Transport, ISendOptions } from './Transport';\n\n// Presence\nexport { Presence } from './presence/Presence';\nexport { LocalPresence } from './presence/LocalPresence';\n\n// Serializers\nexport { Serializer } from './serializer/Serializer';\nexport { SchemaSerializer } from './serializer/SchemaSerializer';\n\n// Utilities\nexport { Clock, Delayed };\nexport { generateId, Deferred, DummyServer, spliceOne
|
|
5
|
-
"mappings": "AAAA,OAAO,SAAS,eAAe;AAG/B,SAAS,QAAQ,qBAAqB;AACtC,SAAS,MAAM,yBAAyB;AACxC,SAAS,UAAU,WAAW,uBAAuB;AACrD,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAG5B,YAAY,gBAAgB;AAE5B,SAAS,aAAa,sBAAsB;AAG5C,cAAc;AAGd,SAAS,QAAQ,aAAa,WAAW,oBAAoB;
|
|
4
|
+
"sourcesContent": ["import Clock, { Delayed } from '@gamestdio/timer';\n\n// Core classes\nexport { Server, ServerOptions } from './Server';\nexport { Room, RoomInternalState } from './Room';\nexport { Protocol, ErrorCode, getMessageBytes } from './Protocol';\nexport { RegisteredHandler } from './matchmaker/RegisteredHandler';\nexport { ServerError } from './errors/ServerError';\n\n// MatchMaker\nimport * as matchMaker from './MatchMaker';\nexport { matchMaker };\nexport { updateLobby, subscribeLobby } from './matchmaker/Lobby';\n\n// Driver\nexport * from './matchmaker/driver';\n\n// Transport\nexport { Client, ClientState, ClientArray, Transport, ISendOptions } from './Transport';\n\n// Presence\nexport { Presence } from './presence/Presence';\nexport { LocalPresence } from './presence/LocalPresence';\n\n// Serializers\nexport { Serializer } from './serializer/Serializer';\nexport { SchemaSerializer } from './serializer/SchemaSerializer';\n\n// Utilities\nexport { Clock, Delayed };\nexport { generateId, Deferred, DummyServer, spliceOne } from './utils/Utils';\nexport { isDevMode } from './utils/DevMode';\n\n// Debug\nexport {\n debugMatchMaking,\n debugMessage,\n debugPatch,\n debugError,\n debugConnection,\n debugDriver,\n debugPresence,\n debugAndPrintError,\n} from './Debug';\n\n// Default rooms\nexport { LobbyRoom } from './rooms/LobbyRoom';\nexport { RelayRoom } from './rooms/RelayRoom';\n\n// Abstract logging support\nexport { logger } from './Logger'\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,SAAS,eAAe;AAG/B,SAAS,QAAQ,qBAAqB;AACtC,SAAS,MAAM,yBAAyB;AACxC,SAAS,UAAU,WAAW,uBAAuB;AACrD,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAG5B,YAAY,gBAAgB;AAE5B,SAAS,aAAa,sBAAsB;AAG5C,cAAc;AAGd,SAAS,QAAQ,aAAa,aAAa,WAAW,oBAAoB;AAG1E,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAG9B,SAAS,kBAAkB;AAC3B,SAAS,wBAAwB;AAIjC,SAAS,YAAY,UAAU,aAAa,iBAAiB;AAC7D,SAAS,iBAAiB;AAG1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAG1B,SAAS,cAAc;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -24,6 +24,7 @@ export declare class LocalPresence implements Presence {
|
|
|
24
24
|
unsubscribe(topic: string, callback?: Callback): this;
|
|
25
25
|
publish(topic: string, data: any): this;
|
|
26
26
|
exists(roomId: string): Promise<boolean>;
|
|
27
|
+
set(key: string, value: string): void;
|
|
27
28
|
setex(key: string, value: string, seconds: number): void;
|
|
28
29
|
get(key: string): string | number;
|
|
29
30
|
del(key: string): void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/presence/LocalPresence.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\n\nimport { EventEmitter } from 'events';\nimport { spliceOne } from '../utils/Utils';\nimport { Presence } from './Presence';\n\nimport { isDevMode } from '../utils/DevMode';\n\ntype Callback = (...args: any[]) => void;\n\nconst DEVMODE_CACHE_FILE_PATH = path.resolve(\".devmode.json\");\n\nexport class LocalPresence implements Presence {\n public channels = new EventEmitter();\n\n public data: {[roomName: string]: string[]} = {};\n public hash: {[roomName: string]: {[key: string]: string}} = {};\n\n public keys: {[name: string]: string | number} = {};\n\n protected subscriptions: {[id: string]: Callback[]} = {};\n private timeouts: {[name: string]: NodeJS.Timer} = {};\n\n constructor() {\n //\n // reload from local cache on devMode\n //\n if (\n isDevMode &&\n fs.existsSync(DEVMODE_CACHE_FILE_PATH)\n ) {\n const cache = fs.readFileSync(DEVMODE_CACHE_FILE_PATH).toString('utf-8') || \"{}\";\n const parsed = JSON.parse(cache);\n this.data = parsed.data;\n this.hash = parsed.hash;\n this.keys = parsed.keys;\n }\n }\n\n public subscribe(topic: string, callback: (...args: any[]) => void) {\n if (!this.subscriptions[topic]) { this.subscriptions[topic] = []; }\n this.subscriptions[topic].push(callback);\n this.channels.on(topic, callback);\n return this;\n }\n\n public unsubscribe(topic: string, callback?: Callback) {\n const topicCallbacks = this.subscriptions[topic];\n if (!topicCallbacks) { return; }\n\n if (callback) {\n const idx = topicCallbacks.indexOf(callback);\n if (idx !== -1) {\n topicCallbacks.splice(idx, 1);\n this.channels.removeListener(topic, callback);\n }\n\n if (topicCallbacks.length === 0) {\n delete this.subscriptions[topic];\n }\n\n } else {\n topicCallbacks.forEach((cb) =>\n this.channels.removeListener(topic, cb));\n\n delete this.subscriptions[topic];\n }\n\n return this;\n }\n\n public publish(topic: string, data: any) {\n this.channels.emit(topic, data);\n return this;\n }\n\n public async exists(roomId: string): Promise<boolean> {\n return this.channels.listenerCount(roomId) > 0;\n }\n\n public setex(key: string, value: string, seconds: number) {\n // ensure previous timeout is clear before setting another one.\n if (this.timeouts[key]) {\n clearTimeout(this.timeouts[key]);\n }\n\n this.keys[key] = value;\n this.timeouts[key] = setTimeout(() => {\n delete this.keys[key];\n delete this.timeouts[key];\n }, seconds * 1000);\n }\n\n public get(key: string) {\n return this.keys[key];\n }\n\n public del(key: string) {\n delete this.keys[key];\n delete this.data[key];\n delete this.hash[key];\n }\n\n public sadd(key: string, value: any) {\n if (!this.data[key]) {\n this.data[key] = [];\n }\n\n if (this.data[key].indexOf(value) === -1) {\n this.data[key].push(value);\n }\n }\n\n public async smembers(key: string): Promise<string[]> {\n return this.data[key] || [];\n }\n\n public async sismember(key: string, field: string) {\n return this.data[key] && this.data[key].includes(field) ? 1 : 0;\n }\n\n public srem(key: string, value: any) {\n if (this.data[key]) {\n spliceOne(this.data[key], this.data[key].indexOf(value));\n }\n }\n\n public scard(key: string) {\n return (this.data[key] || []).length;\n }\n\n public async sinter(...keys: string[]) {\n const intersection: {[value: string]: number} = {};\n\n for (let i = 0, l = keys.length; i < l; i++) {\n (await this.smembers(keys[i])).forEach((member) => {\n if (!intersection[member]) {\n intersection[member] = 0;\n }\n\n intersection[member]++;\n });\n }\n\n return Object.keys(intersection).reduce((prev, curr) => {\n if (intersection[curr] > 1) {\n prev.push(curr);\n }\n return prev;\n }, []);\n }\n\n public hset(key: string, field: string, value: string) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n this.hash[key][field] = value;\n }\n\n public hincrby(key: string, field: string, incrBy: number) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n let value = Number(this.hash[key][field] || '0');\n value += incrBy;\n this.hash[key][field] = value.toString();\n return value;\n }\n\n public async hget(key: string, field: string) {\n return this.hash[key] && this.hash[key][field];\n }\n\n public async hgetall(key: string) {\n return this.hash[key] || {};\n }\n\n public hdel(key: string, field: any) {\n if (this.hash[key]) {\n delete this.hash[key][field];\n }\n }\n\n public async hlen(key: string) {\n return this.hash[key] && Object.keys(this.hash[key]).length || 0;\n }\n\n public async incr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)++;\n return Promise.resolve(this.keys[key] as number);\n }\n\n public async decr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)--;\n return Promise.resolve(this.keys[key] as number);\n }\n\n public shutdown() {\n if (isDevMode) {\n const cache = JSON.stringify({\n data: this.data,\n hash: this.hash,\n keys: this.keys\n });\n fs.writeFileSync(DEVMODE_CACHE_FILE_PATH, cache, { encoding: \"utf-8\" });\n }\n }\n\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAe;AACf,kBAAiB;AAEjB,oBAA6B;AAC7B,mBAA0B;AAG1B,qBAA0B;AAI1B,MAAM,0BAA0B,YAAAA,QAAK,QAAQ,eAAe;AAErD,MAAM,cAAkC;AAAA,EACpC,WAAW,IAAI,2BAAa;AAAA,EAE5B,OAAuC,CAAC;AAAA,EACxC,OAAsD,CAAC;AAAA,EAEvD,OAA0C,CAAC;AAAA,EAExC,gBAA4C,CAAC;AAAA,EAC/C,WAA2C,CAAC;AAAA,EAEpD,cAAc;AAIZ,QACE,4BACA,UAAAC,QAAG,WAAW,uBAAuB,GACrC;AACA,YAAM,QAAQ,UAAAA,QAAG,aAAa,uBAAuB,EAAE,SAAS,OAAO,KAAK;AAC5E,YAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAK,OAAO,OAAO;AACnB,WAAK,OAAO,OAAO;AACnB,WAAK,OAAO,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAEO,UAAU,OAAe,UAAoC;AAChE,QAAI,CAAC,KAAK,cAAc,QAAQ;AAAE,WAAK,cAAc,SAAS,CAAC;AAAA,IAAG;AAClE,SAAK,cAAc,OAAO,KAAK,QAAQ;AACvC,SAAK,SAAS,GAAG,OAAO,QAAQ;AAChC,WAAO;AAAA,EACX;AAAA,EAEO,YAAY,OAAe,UAAqB;AACnD,UAAM,iBAAiB,KAAK,cAAc;AAC1C,QAAI,CAAC,gBAAgB;AAAE;AAAA,IAAQ;AAE/B,QAAI,UAAW;AACX,YAAM,MAAM,eAAe,QAAQ,QAAQ;AAC3C,UAAI,QAAQ,IAAI;AACZ,uBAAe,OAAO,KAAK,CAAC;AAC5B,aAAK,SAAS,eAAe,OAAO,QAAQ;AAAA,MAChD;AAEA,UAAI,eAAe,WAAW,GAAG;AAC7B,eAAO,KAAK,cAAc;AAAA,MAC9B;AAAA,IAEJ,OAAO;AACL,qBAAe,QAAQ,CAAC,OACtB,KAAK,SAAS,eAAe,OAAO,EAAE,CAAC;AAEzC,aAAO,KAAK,cAAc;AAAA,IAC5B;AAEA,WAAO;AAAA,EACX;AAAA,EAEO,QAAQ,OAAe,MAAW;AACrC,SAAK,SAAS,KAAK,OAAO,IAAI;AAC9B,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,OAAO,QAAkC;AAClD,WAAO,KAAK,SAAS,cAAc,MAAM,IAAI;AAAA,EACjD;AAAA,EAEO,MAAM,KAAa,OAAe,SAAiB;AAEtD,QAAI,KAAK,SAAS,MAAM;AACpB,mBAAa,KAAK,SAAS,IAAI;AAAA,IACnC;AAEA,SAAK,KAAK,OAAO;AACjB,SAAK,SAAS,OAAO,WAAW,MAAM;AAClC,aAAO,KAAK,KAAK;AACjB,aAAO,KAAK,SAAS;AAAA,IACzB,GAAG,UAAU,GAAI;AAAA,EACrB;AAAA,EAEO,IAAI,KAAa;AACpB,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEO,IAAI,KAAa;AACpB,WAAO,KAAK,KAAK;AACjB,WAAO,KAAK,KAAK;AACjB,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEO,KAAK,KAAa,OAAY;AACjC,QAAI,CAAC,KAAK,KAAK,MAAM;AACjB,WAAK,KAAK,OAAO,CAAC;AAAA,IACtB;AAEA,QAAI,KAAK,KAAK,KAAK,QAAQ,KAAK,MAAM,IAAI;AACtC,WAAK,KAAK,KAAK,KAAK,KAAK;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEA,MAAa,SAAS,KAAgC;AAClD,WAAO,KAAK,KAAK,QAAQ,CAAC;AAAA,EAC9B;AAAA,EAEA,MAAa,UAAU,KAAa,OAAe;AAC/C,WAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK,SAAS,KAAK,IAAI,IAAI;AAAA,EAClE;AAAA,EAEO,KAAK,KAAa,OAAY;AACjC,QAAI,KAAK,KAAK,MAAM;AAChB,kCAAU,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEO,MAAM,KAAa;AACtB,YAAQ,KAAK,KAAK,QAAQ,CAAC,GAAG;AAAA,EAClC;AAAA,EAEA,MAAa,UAAU,MAAgB;AACrC,UAAM,eAA0C,CAAC;AAEjD,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK;AAC3C,OAAC,MAAM,KAAK,SAAS,KAAK,EAAE,GAAG,QAAQ,CAAC,WAAW;AACjD,YAAI,CAAC,aAAa,SAAS;AACzB,uBAAa,UAAU;AAAA,QACzB;AAEA,qBAAa;AAAA,MACf,CAAC;AAAA,IACH;AAEA,WAAO,OAAO,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,SAAS;AACtD,UAAI,aAAa,QAAQ,GAAG;AAC1B,aAAK,KAAK,IAAI;AAAA,MAChB;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AAAA,EAEO,KAAK,KAAa,OAAe,OAAe;AACnD,QAAI,CAAC,KAAK,KAAK,MAAM;AAAE,WAAK,KAAK,OAAO,CAAC;AAAA,IAAG;AAC5C,SAAK,KAAK,KAAK,SAAS;AAAA,EAC5B;AAAA,EAEO,QAAQ,KAAa,OAAe,QAAgB;AACvD,QAAI,CAAC,KAAK,KAAK,MAAM;AAAE,WAAK,KAAK,OAAO,CAAC;AAAA,IAAG;AAC5C,QAAI,QAAQ,OAAO,KAAK,KAAK,KAAK,UAAU,GAAG;AAC/C,aAAS;AACT,SAAK,KAAK,KAAK,SAAS,MAAM,SAAS;AACvC,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,KAAK,KAAa,OAAe;AAC1C,WAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK;AAAA,EAC5C;AAAA,EAEA,MAAa,QAAQ,KAAa;AAC9B,WAAO,KAAK,KAAK,QAAQ,CAAC;AAAA,EAC9B;AAAA,EAEO,KAAK,KAAa,OAAY;AACjC,QAAI,KAAK,KAAK,MAAM;AAChB,aAAO,KAAK,KAAK,KAAK;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEA,MAAa,KAAK,KAAa;AAC3B,WAAO,KAAK,KAAK,QAAQ,OAAO,KAAK,KAAK,KAAK,IAAI,EAAE,UAAU;AAAA,EACnE;AAAA,EAEA,MAAa,KAAK,KAAa;AAC3B,QAAI,CAAC,KAAK,KAAK,MAAM;AACjB,WAAK,KAAK,OAAO;AAAA,IACrB;AACA,IAAC,KAAK,KAAK;AACX,WAAO,QAAQ,QAAQ,KAAK,KAAK,IAAc;AAAA,EACnD;AAAA,EAEA,MAAa,KAAK,KAAa;AAC3B,QAAI,CAAC,KAAK,KAAK,MAAM;AACjB,WAAK,KAAK,OAAO;AAAA,IACrB;AACA,IAAC,KAAK,KAAK;AACX,WAAO,QAAQ,QAAQ,KAAK,KAAK,IAAc;AAAA,EACnD;AAAA,EAEO,WAAW;AAChB,QAAI,0BAAW;AACb,YAAM,QAAQ,KAAK,UAAU;AAAA,QAC3B,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,MACb,CAAC;AACD,gBAAAA,QAAG,cAAc,yBAAyB,OAAO,EAAE,UAAU,QAAQ,CAAC;AAAA,IACxE;AAAA,EACF;AAEJ;",
|
|
4
|
+
"sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\n\nimport { EventEmitter } from 'events';\nimport { spliceOne } from '../utils/Utils';\nimport { Presence } from './Presence';\n\nimport { isDevMode } from '../utils/DevMode';\n\ntype Callback = (...args: any[]) => void;\n\nconst DEVMODE_CACHE_FILE_PATH = path.resolve(\".devmode.json\");\n\nexport class LocalPresence implements Presence {\n public channels = new EventEmitter();\n\n public data: {[roomName: string]: string[]} = {};\n public hash: {[roomName: string]: {[key: string]: string}} = {};\n\n public keys: {[name: string]: string | number} = {};\n\n protected subscriptions: {[id: string]: Callback[]} = {};\n private timeouts: {[name: string]: NodeJS.Timer} = {};\n\n constructor() {\n //\n // reload from local cache on devMode\n //\n if (\n isDevMode &&\n fs.existsSync(DEVMODE_CACHE_FILE_PATH)\n ) {\n const cache = fs.readFileSync(DEVMODE_CACHE_FILE_PATH).toString('utf-8') || \"{}\";\n const parsed = JSON.parse(cache);\n this.data = parsed.data;\n this.hash = parsed.hash;\n this.keys = parsed.keys;\n }\n }\n\n public subscribe(topic: string, callback: (...args: any[]) => void) {\n if (!this.subscriptions[topic]) { this.subscriptions[topic] = []; }\n this.subscriptions[topic].push(callback);\n this.channels.on(topic, callback);\n return this;\n }\n\n public unsubscribe(topic: string, callback?: Callback) {\n const topicCallbacks = this.subscriptions[topic];\n if (!topicCallbacks) { return; }\n\n if (callback) {\n const idx = topicCallbacks.indexOf(callback);\n if (idx !== -1) {\n topicCallbacks.splice(idx, 1);\n this.channels.removeListener(topic, callback);\n }\n\n if (topicCallbacks.length === 0) {\n delete this.subscriptions[topic];\n }\n\n } else {\n topicCallbacks.forEach((cb) =>\n this.channels.removeListener(topic, cb));\n\n delete this.subscriptions[topic];\n }\n\n return this;\n }\n\n public publish(topic: string, data: any) {\n this.channels.emit(topic, data);\n return this;\n }\n\n public async exists(roomId: string): Promise<boolean> {\n return this.channels.listenerCount(roomId) > 0;\n }\n\n public set(key: string, value: string) {\n this.keys[key] = value;\n }\n\n public setex(key: string, value: string, seconds: number) {\n // ensure previous timeout is clear before setting another one.\n if (this.timeouts[key]) {\n clearTimeout(this.timeouts[key]);\n }\n\n this.keys[key] = value;\n this.timeouts[key] = setTimeout(() => {\n delete this.keys[key];\n delete this.timeouts[key];\n }, seconds * 1000);\n }\n\n public get(key: string) {\n return this.keys[key];\n }\n\n public del(key: string) {\n delete this.keys[key];\n delete this.data[key];\n delete this.hash[key];\n }\n\n public sadd(key: string, value: any) {\n if (!this.data[key]) {\n this.data[key] = [];\n }\n\n if (this.data[key].indexOf(value) === -1) {\n this.data[key].push(value);\n }\n }\n\n public async smembers(key: string): Promise<string[]> {\n return this.data[key] || [];\n }\n\n public async sismember(key: string, field: string) {\n return this.data[key] && this.data[key].includes(field) ? 1 : 0;\n }\n\n public srem(key: string, value: any) {\n if (this.data[key]) {\n spliceOne(this.data[key], this.data[key].indexOf(value));\n }\n }\n\n public scard(key: string) {\n return (this.data[key] || []).length;\n }\n\n public async sinter(...keys: string[]) {\n const intersection: {[value: string]: number} = {};\n\n for (let i = 0, l = keys.length; i < l; i++) {\n (await this.smembers(keys[i])).forEach((member) => {\n if (!intersection[member]) {\n intersection[member] = 0;\n }\n\n intersection[member]++;\n });\n }\n\n return Object.keys(intersection).reduce((prev, curr) => {\n if (intersection[curr] > 1) {\n prev.push(curr);\n }\n return prev;\n }, []);\n }\n\n public hset(key: string, field: string, value: string) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n this.hash[key][field] = value;\n }\n\n public hincrby(key: string, field: string, incrBy: number) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n let value = Number(this.hash[key][field] || '0');\n value += incrBy;\n this.hash[key][field] = value.toString();\n return value;\n }\n\n public async hget(key: string, field: string) {\n return this.hash[key] && this.hash[key][field];\n }\n\n public async hgetall(key: string) {\n return this.hash[key] || {};\n }\n\n public hdel(key: string, field: any) {\n if (this.hash[key]) {\n delete this.hash[key][field];\n }\n }\n\n public async hlen(key: string) {\n return this.hash[key] && Object.keys(this.hash[key]).length || 0;\n }\n\n public async incr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)++;\n return Promise.resolve(this.keys[key] as number);\n }\n\n public async decr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)--;\n return Promise.resolve(this.keys[key] as number);\n }\n\n public shutdown() {\n if (isDevMode) {\n const cache = JSON.stringify({\n data: this.data,\n hash: this.hash,\n keys: this.keys\n });\n fs.writeFileSync(DEVMODE_CACHE_FILE_PATH, cache, { encoding: \"utf-8\" });\n }\n }\n\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "fs"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/presence/LocalPresence.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\n\nimport { EventEmitter } from 'events';\nimport { spliceOne } from '../utils/Utils';\nimport { Presence } from './Presence';\n\nimport { isDevMode } from '../utils/DevMode';\n\ntype Callback = (...args: any[]) => void;\n\nconst DEVMODE_CACHE_FILE_PATH = path.resolve(\".devmode.json\");\n\nexport class LocalPresence implements Presence {\n public channels = new EventEmitter();\n\n public data: {[roomName: string]: string[]} = {};\n public hash: {[roomName: string]: {[key: string]: string}} = {};\n\n public keys: {[name: string]: string | number} = {};\n\n protected subscriptions: {[id: string]: Callback[]} = {};\n private timeouts: {[name: string]: NodeJS.Timer} = {};\n\n constructor() {\n //\n // reload from local cache on devMode\n //\n if (\n isDevMode &&\n fs.existsSync(DEVMODE_CACHE_FILE_PATH)\n ) {\n const cache = fs.readFileSync(DEVMODE_CACHE_FILE_PATH).toString('utf-8') || \"{}\";\n const parsed = JSON.parse(cache);\n this.data = parsed.data;\n this.hash = parsed.hash;\n this.keys = parsed.keys;\n }\n }\n\n public subscribe(topic: string, callback: (...args: any[]) => void) {\n if (!this.subscriptions[topic]) { this.subscriptions[topic] = []; }\n this.subscriptions[topic].push(callback);\n this.channels.on(topic, callback);\n return this;\n }\n\n public unsubscribe(topic: string, callback?: Callback) {\n const topicCallbacks = this.subscriptions[topic];\n if (!topicCallbacks) { return; }\n\n if (callback) {\n const idx = topicCallbacks.indexOf(callback);\n if (idx !== -1) {\n topicCallbacks.splice(idx, 1);\n this.channels.removeListener(topic, callback);\n }\n\n if (topicCallbacks.length === 0) {\n delete this.subscriptions[topic];\n }\n\n } else {\n topicCallbacks.forEach((cb) =>\n this.channels.removeListener(topic, cb));\n\n delete this.subscriptions[topic];\n }\n\n return this;\n }\n\n public publish(topic: string, data: any) {\n this.channels.emit(topic, data);\n return this;\n }\n\n public async exists(roomId: string): Promise<boolean> {\n return this.channels.listenerCount(roomId) > 0;\n }\n\n public setex(key: string, value: string, seconds: number) {\n // ensure previous timeout is clear before setting another one.\n if (this.timeouts[key]) {\n clearTimeout(this.timeouts[key]);\n }\n\n this.keys[key] = value;\n this.timeouts[key] = setTimeout(() => {\n delete this.keys[key];\n delete this.timeouts[key];\n }, seconds * 1000);\n }\n\n public get(key: string) {\n return this.keys[key];\n }\n\n public del(key: string) {\n delete this.keys[key];\n delete this.data[key];\n delete this.hash[key];\n }\n\n public sadd(key: string, value: any) {\n if (!this.data[key]) {\n this.data[key] = [];\n }\n\n if (this.data[key].indexOf(value) === -1) {\n this.data[key].push(value);\n }\n }\n\n public async smembers(key: string): Promise<string[]> {\n return this.data[key] || [];\n }\n\n public async sismember(key: string, field: string) {\n return this.data[key] && this.data[key].includes(field) ? 1 : 0;\n }\n\n public srem(key: string, value: any) {\n if (this.data[key]) {\n spliceOne(this.data[key], this.data[key].indexOf(value));\n }\n }\n\n public scard(key: string) {\n return (this.data[key] || []).length;\n }\n\n public async sinter(...keys: string[]) {\n const intersection: {[value: string]: number} = {};\n\n for (let i = 0, l = keys.length; i < l; i++) {\n (await this.smembers(keys[i])).forEach((member) => {\n if (!intersection[member]) {\n intersection[member] = 0;\n }\n\n intersection[member]++;\n });\n }\n\n return Object.keys(intersection).reduce((prev, curr) => {\n if (intersection[curr] > 1) {\n prev.push(curr);\n }\n return prev;\n }, []);\n }\n\n public hset(key: string, field: string, value: string) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n this.hash[key][field] = value;\n }\n\n public hincrby(key: string, field: string, incrBy: number) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n let value = Number(this.hash[key][field] || '0');\n value += incrBy;\n this.hash[key][field] = value.toString();\n return value;\n }\n\n public async hget(key: string, field: string) {\n return this.hash[key] && this.hash[key][field];\n }\n\n public async hgetall(key: string) {\n return this.hash[key] || {};\n }\n\n public hdel(key: string, field: any) {\n if (this.hash[key]) {\n delete this.hash[key][field];\n }\n }\n\n public async hlen(key: string) {\n return this.hash[key] && Object.keys(this.hash[key]).length || 0;\n }\n\n public async incr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)++;\n return Promise.resolve(this.keys[key] as number);\n }\n\n public async decr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)--;\n return Promise.resolve(this.keys[key] as number);\n }\n\n public shutdown() {\n if (isDevMode) {\n const cache = JSON.stringify({\n data: this.data,\n hash: this.hash,\n keys: this.keys\n });\n fs.writeFileSync(DEVMODE_CACHE_FILE_PATH, cache, { encoding: \"utf-8\" });\n }\n }\n\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import fs from \"fs\";\nimport path from \"path\";\n\nimport { EventEmitter } from 'events';\nimport { spliceOne } from '../utils/Utils';\nimport { Presence } from './Presence';\n\nimport { isDevMode } from '../utils/DevMode';\n\ntype Callback = (...args: any[]) => void;\n\nconst DEVMODE_CACHE_FILE_PATH = path.resolve(\".devmode.json\");\n\nexport class LocalPresence implements Presence {\n public channels = new EventEmitter();\n\n public data: {[roomName: string]: string[]} = {};\n public hash: {[roomName: string]: {[key: string]: string}} = {};\n\n public keys: {[name: string]: string | number} = {};\n\n protected subscriptions: {[id: string]: Callback[]} = {};\n private timeouts: {[name: string]: NodeJS.Timer} = {};\n\n constructor() {\n //\n // reload from local cache on devMode\n //\n if (\n isDevMode &&\n fs.existsSync(DEVMODE_CACHE_FILE_PATH)\n ) {\n const cache = fs.readFileSync(DEVMODE_CACHE_FILE_PATH).toString('utf-8') || \"{}\";\n const parsed = JSON.parse(cache);\n this.data = parsed.data;\n this.hash = parsed.hash;\n this.keys = parsed.keys;\n }\n }\n\n public subscribe(topic: string, callback: (...args: any[]) => void) {\n if (!this.subscriptions[topic]) { this.subscriptions[topic] = []; }\n this.subscriptions[topic].push(callback);\n this.channels.on(topic, callback);\n return this;\n }\n\n public unsubscribe(topic: string, callback?: Callback) {\n const topicCallbacks = this.subscriptions[topic];\n if (!topicCallbacks) { return; }\n\n if (callback) {\n const idx = topicCallbacks.indexOf(callback);\n if (idx !== -1) {\n topicCallbacks.splice(idx, 1);\n this.channels.removeListener(topic, callback);\n }\n\n if (topicCallbacks.length === 0) {\n delete this.subscriptions[topic];\n }\n\n } else {\n topicCallbacks.forEach((cb) =>\n this.channels.removeListener(topic, cb));\n\n delete this.subscriptions[topic];\n }\n\n return this;\n }\n\n public publish(topic: string, data: any) {\n this.channels.emit(topic, data);\n return this;\n }\n\n public async exists(roomId: string): Promise<boolean> {\n return this.channels.listenerCount(roomId) > 0;\n }\n\n public set(key: string, value: string) {\n this.keys[key] = value;\n }\n\n public setex(key: string, value: string, seconds: number) {\n // ensure previous timeout is clear before setting another one.\n if (this.timeouts[key]) {\n clearTimeout(this.timeouts[key]);\n }\n\n this.keys[key] = value;\n this.timeouts[key] = setTimeout(() => {\n delete this.keys[key];\n delete this.timeouts[key];\n }, seconds * 1000);\n }\n\n public get(key: string) {\n return this.keys[key];\n }\n\n public del(key: string) {\n delete this.keys[key];\n delete this.data[key];\n delete this.hash[key];\n }\n\n public sadd(key: string, value: any) {\n if (!this.data[key]) {\n this.data[key] = [];\n }\n\n if (this.data[key].indexOf(value) === -1) {\n this.data[key].push(value);\n }\n }\n\n public async smembers(key: string): Promise<string[]> {\n return this.data[key] || [];\n }\n\n public async sismember(key: string, field: string) {\n return this.data[key] && this.data[key].includes(field) ? 1 : 0;\n }\n\n public srem(key: string, value: any) {\n if (this.data[key]) {\n spliceOne(this.data[key], this.data[key].indexOf(value));\n }\n }\n\n public scard(key: string) {\n return (this.data[key] || []).length;\n }\n\n public async sinter(...keys: string[]) {\n const intersection: {[value: string]: number} = {};\n\n for (let i = 0, l = keys.length; i < l; i++) {\n (await this.smembers(keys[i])).forEach((member) => {\n if (!intersection[member]) {\n intersection[member] = 0;\n }\n\n intersection[member]++;\n });\n }\n\n return Object.keys(intersection).reduce((prev, curr) => {\n if (intersection[curr] > 1) {\n prev.push(curr);\n }\n return prev;\n }, []);\n }\n\n public hset(key: string, field: string, value: string) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n this.hash[key][field] = value;\n }\n\n public hincrby(key: string, field: string, incrBy: number) {\n if (!this.hash[key]) { this.hash[key] = {}; }\n let value = Number(this.hash[key][field] || '0');\n value += incrBy;\n this.hash[key][field] = value.toString();\n return value;\n }\n\n public async hget(key: string, field: string) {\n return this.hash[key] && this.hash[key][field];\n }\n\n public async hgetall(key: string) {\n return this.hash[key] || {};\n }\n\n public hdel(key: string, field: any) {\n if (this.hash[key]) {\n delete this.hash[key][field];\n }\n }\n\n public async hlen(key: string) {\n return this.hash[key] && Object.keys(this.hash[key]).length || 0;\n }\n\n public async incr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)++;\n return Promise.resolve(this.keys[key] as number);\n }\n\n public async decr(key: string) {\n if (!this.keys[key]) {\n this.keys[key] = 0;\n }\n (this.keys[key] as number)--;\n return Promise.resolve(this.keys[key] as number);\n }\n\n public shutdown() {\n if (isDevMode) {\n const cache = JSON.stringify({\n data: this.data,\n hash: this.hash,\n keys: this.keys\n });\n fs.writeFileSync(DEVMODE_CACHE_FILE_PATH, cache, { encoding: \"utf-8\" });\n }\n }\n\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -37,6 +37,13 @@ export interface Presence {
|
|
|
37
37
|
* @param roomId
|
|
38
38
|
*/
|
|
39
39
|
exists(roomId: string): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Set key to hold the string value.
|
|
42
|
+
*
|
|
43
|
+
* @param key - Identifier.
|
|
44
|
+
* @param value - Message body/object.
|
|
45
|
+
*/
|
|
46
|
+
set(key: string, value: string): any;
|
|
40
47
|
/**
|
|
41
48
|
* Set key to hold the string value and set key to timeout after a given number of seconds.
|
|
42
49
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/presence/Presence.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * When you need to scale your server on multiple processes and/or machines, you'd need to provide\n * the Presence option to the Server. The purpose of Presence is to allow communicating and\n * sharing data between different processes, specially during match-making.\n *\n * - Local presence - This is the default option. It's meant to be used when you're running Colyseus in\n * a single process.\n * - Redis presence - Use this option when you're running Colyseus on multiple processes and/or machines.\n *\n * @default Local presence\n */\nexport interface Presence {\n /**\n * Subscribes to the given topic. The callback will be triggered whenever a message is published on topic.\n *\n * @param topic - Topic name.\n * @param callback - Callback to trigger on subscribing.\n */\n subscribe(topic: string, callback: Function);\n /**\n * Unsubscribe from given topic.\n *\n * @param topic - Topic name.\n * @param callback - Callback to trigger on topic unsubscribing.\n */\n unsubscribe(topic: string, callback?: Function);\n\n /**\n * Posts a message to given topic.\n *\n * @param topic - Topic name.\n * @param data - Message body/object.\n */\n publish(topic: string, data: any);\n\n /**\n * Returns if key exists.\n *\n * @param roomId\n */\n exists(roomId: string): Promise<boolean>;\n\n /**\n * Set key to hold the string value and set key to timeout after a given number of seconds.\n *\n * @param key - Identifier.\n * @param value - Message body/object.\n * @param seconds - Timeout value.\n */\n setex(key: string, value: string, seconds: number);\n\n /**\n * Get the value of key.\n *\n * @param key - Identifier.\n */\n get(key: string);\n\n /**\n * Removes the specified key.\n *\n * @param key - Identifier of the object to removed.\n */\n del(key: string): void;\n\n /**\n * Add the specified members to the set stored at key. Specified members that are already\n * a member of this set are ignored. If key does not exist, a new set is created before\n * adding the specified members.\n *\n * @param key - Name/Identifier of the set.\n * @param value - Message body/object.\n */\n sadd(key: string, value: any);\n /**\n * Returns all the members of the set value stored at key.\n *\n * @param key - Name/Identifier of the set.\n */\n smembers(key: string): Promise<string[]>;\n /**\n * Returns if member is a member of the set stored at key.\n *\n * @param key - Name/Identifier of the set.\n * @param field - Key value within the set.\n * @returns `1` if the element is a member of the set else `0`.\n */\n sismember(key: string, field: string);\n /**\n * Remove the specified members from the set stored at key. Specified members that are not a\n * member of this set are ignored. If key does not exist, it is treated as an empty set\n * and this command returns 0.\n *\n * @param key - Name/Identifier of the set.\n * @param value - Key value within the set.\n */\n srem(key: string, value: any);\n /**\n * Returns the set cardinality (number of elements) of the set stored at key.\n *\n * @param key - Name/Identifier of the set.\n */\n scard(key: string);\n /**\n * Returns the members of the set resulting from the intersection of all the given sets.\n *\n * @param keys - Key values within the set.\n */\n sinter(...keys: string[]): Promise<string[]>;\n\n /**\n * Sets field in the hash stored at key to value. If key does not exist, a new key holding a hash is created.\n * If field already exists in the hash, it is overwritten.\n */\n hset(key: string, field: string, value: string);\n\n /**\n * Increments the number stored at field in the hash stored at key by increment. If key does not exist, a new key\n * holding a hash is created. If field does not exist the value is set to 0 before the operation is performed.\n */\n hincrby(key: string, field: string, value: number): number | Promise<number>;\n\n /**\n * Returns the value associated with field in the hash stored at key.\n */\n hget(key: string, field: string): Promise<string>;\n\n /**\n * Returns all fields and values of the hash stored at key.\n */\n hgetall(key: string): Promise<{ [key: string]: string }>;\n\n /**\n * Removes the specified fields from the hash stored at key. Specified fields that do not exist within\n * this hash are ignored. If key does not exist, it is treated as an empty hash and this command returns 0.\n */\n hdel(key: string, field: string);\n\n /**\n * Returns the number of fields contained in the hash stored at key\n */\n hlen(key: string): Promise<number>;\n\n /**\n * Increments the number stored at key by one. If the key does not exist, it is set to 0 before performing\n * the operation. An error is returned if the key contains a value of the wrong type or\n * contains a string that can not be represented as integer. This operation is limited to 64-bit signed integers.\n */\n incr(key: string): Promise<number>;\n\n /**\n * Decrements the number stored at key by one. If the key does not exist, it is set to 0 before performing\n * the operation. An error is returned if the key contains a value of the wrong type or contains a string\n * that can not be represented as integer. This operation is limited to 64-bit signed integers.\n */\n decr(key: string): Promise<number>;\n\n shutdown(): void;\n}\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * When you need to scale your server on multiple processes and/or machines, you'd need to provide\n * the Presence option to the Server. The purpose of Presence is to allow communicating and\n * sharing data between different processes, specially during match-making.\n *\n * - Local presence - This is the default option. It's meant to be used when you're running Colyseus in\n * a single process.\n * - Redis presence - Use this option when you're running Colyseus on multiple processes and/or machines.\n *\n * @default Local presence\n */\nexport interface Presence {\n /**\n * Subscribes to the given topic. The callback will be triggered whenever a message is published on topic.\n *\n * @param topic - Topic name.\n * @param callback - Callback to trigger on subscribing.\n */\n subscribe(topic: string, callback: Function);\n /**\n * Unsubscribe from given topic.\n *\n * @param topic - Topic name.\n * @param callback - Callback to trigger on topic unsubscribing.\n */\n unsubscribe(topic: string, callback?: Function);\n\n /**\n * Posts a message to given topic.\n *\n * @param topic - Topic name.\n * @param data - Message body/object.\n */\n publish(topic: string, data: any);\n\n /**\n * Returns if key exists.\n *\n * @param roomId\n */\n exists(roomId: string): Promise<boolean>;\n\n /**\n * Set key to hold the string value.\n *\n * @param key - Identifier.\n * @param value - Message body/object.\n */\n set(key: string, value: string);\n\n /**\n * Set key to hold the string value and set key to timeout after a given number of seconds.\n *\n * @param key - Identifier.\n * @param value - Message body/object.\n * @param seconds - Timeout value.\n */\n setex(key: string, value: string, seconds: number);\n\n /**\n * Get the value of key.\n *\n * @param key - Identifier.\n */\n get(key: string);\n\n /**\n * Removes the specified key.\n *\n * @param key - Identifier of the object to removed.\n */\n del(key: string): void;\n\n /**\n * Add the specified members to the set stored at key. Specified members that are already\n * a member of this set are ignored. If key does not exist, a new set is created before\n * adding the specified members.\n *\n * @param key - Name/Identifier of the set.\n * @param value - Message body/object.\n */\n sadd(key: string, value: any);\n /**\n * Returns all the members of the set value stored at key.\n *\n * @param key - Name/Identifier of the set.\n */\n smembers(key: string): Promise<string[]>;\n /**\n * Returns if member is a member of the set stored at key.\n *\n * @param key - Name/Identifier of the set.\n * @param field - Key value within the set.\n * @returns `1` if the element is a member of the set else `0`.\n */\n sismember(key: string, field: string);\n /**\n * Remove the specified members from the set stored at key. Specified members that are not a\n * member of this set are ignored. If key does not exist, it is treated as an empty set\n * and this command returns 0.\n *\n * @param key - Name/Identifier of the set.\n * @param value - Key value within the set.\n */\n srem(key: string, value: any);\n /**\n * Returns the set cardinality (number of elements) of the set stored at key.\n *\n * @param key - Name/Identifier of the set.\n */\n scard(key: string);\n /**\n * Returns the members of the set resulting from the intersection of all the given sets.\n *\n * @param keys - Key values within the set.\n */\n sinter(...keys: string[]): Promise<string[]>;\n\n /**\n * Sets field in the hash stored at key to value. If key does not exist, a new key holding a hash is created.\n * If field already exists in the hash, it is overwritten.\n */\n hset(key: string, field: string, value: string);\n\n /**\n * Increments the number stored at field in the hash stored at key by increment. If key does not exist, a new key\n * holding a hash is created. If field does not exist the value is set to 0 before the operation is performed.\n */\n hincrby(key: string, field: string, value: number): number | Promise<number>;\n\n /**\n * Returns the value associated with field in the hash stored at key.\n */\n hget(key: string, field: string): Promise<string>;\n\n /**\n * Returns all fields and values of the hash stored at key.\n */\n hgetall(key: string): Promise<{ [key: string]: string }>;\n\n /**\n * Removes the specified fields from the hash stored at key. Specified fields that do not exist within\n * this hash are ignored. If key does not exist, it is treated as an empty hash and this command returns 0.\n */\n hdel(key: string, field: string);\n\n /**\n * Returns the number of fields contained in the hash stored at key\n */\n hlen(key: string): Promise<number>;\n\n /**\n * Increments the number stored at key by one. If the key does not exist, it is set to 0 before performing\n * the operation. An error is returned if the key contains a value of the wrong type or\n * contains a string that can not be represented as integer. This operation is limited to 64-bit signed integers.\n */\n incr(key: string): Promise<number>;\n\n /**\n * Decrements the number stored at key by one. If the key does not exist, it is set to 0 before performing\n * the operation. An error is returned if the key contains a value of the wrong type or contains a string\n * that can not be represented as integer. This operation is limited to 64-bit signed integers.\n */\n decr(key: string): Promise<number>;\n\n shutdown(): void;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/utils/Utils.d.ts
CHANGED
|
@@ -16,31 +16,6 @@ export declare class Deferred<T = any> {
|
|
|
16
16
|
catch(func: (value: any) => any): Promise<any>;
|
|
17
17
|
}
|
|
18
18
|
export declare function merge(a: any, ...objs: any[]): any;
|
|
19
|
-
export declare class HybridArray<T> {
|
|
20
|
-
uniqueProperty: string;
|
|
21
|
-
hashedArray: {
|
|
22
|
-
[key: string]: T;
|
|
23
|
-
};
|
|
24
|
-
array: T[];
|
|
25
|
-
constructor(uniquePropertyName: string, items?: T[]);
|
|
26
|
-
get length(): number;
|
|
27
|
-
add(item: T): void;
|
|
28
|
-
at(index: number): T | undefined;
|
|
29
|
-
concat(items: T[]): this;
|
|
30
|
-
find<S extends T>(predicate: (this: void, value: T, index: number, obj: T[]) => value is S, thisArg?: any): S;
|
|
31
|
-
find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T;
|
|
32
|
-
filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];
|
|
33
|
-
forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
|
|
34
|
-
get(key: string): T | undefined;
|
|
35
|
-
includes(element: T): boolean;
|
|
36
|
-
indexOf(element: T): number;
|
|
37
|
-
map<U>(callback: (value: T, index: number, array: T[]) => U): U[];
|
|
38
|
-
deleteAt(index: number): T;
|
|
39
|
-
deleteByKey(key: string): T;
|
|
40
|
-
delete(obj: T): T;
|
|
41
|
-
private _badIndexWarning;
|
|
42
|
-
private spliceOne;
|
|
43
|
-
}
|
|
44
19
|
export declare interface DummyServer {
|
|
45
20
|
constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void): any;
|
|
46
21
|
listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;
|
package/build/utils/Utils.js
CHANGED
|
@@ -25,7 +25,6 @@ var Utils_exports = {};
|
|
|
25
25
|
__export(Utils_exports, {
|
|
26
26
|
Deferred: () => Deferred,
|
|
27
27
|
DummyServer: () => DummyServer,
|
|
28
|
-
HybridArray: () => HybridArray,
|
|
29
28
|
REMOTE_ROOM_SHORT_TIMEOUT: () => REMOTE_ROOM_SHORT_TIMEOUT,
|
|
30
29
|
generateId: () => generateId,
|
|
31
30
|
merge: () => merge,
|
|
@@ -38,7 +37,6 @@ var import_nanoid = __toESM(require("nanoid"));
|
|
|
38
37
|
var import_msgpackr = require("msgpackr");
|
|
39
38
|
var import_Debug = require("../Debug");
|
|
40
39
|
var import_events = require("events");
|
|
41
|
-
var import_Logger = require("../Logger");
|
|
42
40
|
var import_schema = require("@colyseus/schema");
|
|
43
41
|
const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2e3);
|
|
44
42
|
function generateId(length = 9) {
|
|
@@ -104,117 +102,6 @@ function merge(a, ...objs) {
|
|
|
104
102
|
}
|
|
105
103
|
return a;
|
|
106
104
|
}
|
|
107
|
-
class HybridArray {
|
|
108
|
-
uniqueProperty;
|
|
109
|
-
hashedArray = {};
|
|
110
|
-
array = [];
|
|
111
|
-
constructor(uniquePropertyName, items) {
|
|
112
|
-
this.uniqueProperty = uniquePropertyName;
|
|
113
|
-
if (items) {
|
|
114
|
-
this.array = this.array.concat(items);
|
|
115
|
-
for (const element of items) {
|
|
116
|
-
this.hashedArray[element[this.uniqueProperty]] = element;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
get length() {
|
|
121
|
-
return this.array.length;
|
|
122
|
-
}
|
|
123
|
-
add(item) {
|
|
124
|
-
if (!this.hashedArray[item[this.uniqueProperty]]) {
|
|
125
|
-
this.array.push(item);
|
|
126
|
-
this.hashedArray[item[this.uniqueProperty]] = item;
|
|
127
|
-
} else {
|
|
128
|
-
import_Logger.logger.warn(`.add(): element already exists:`, item[this.uniqueProperty]);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
at(index) {
|
|
132
|
-
if (index >= this.array.length) {
|
|
133
|
-
this._badIndexWarning(index);
|
|
134
|
-
} else {
|
|
135
|
-
return this.array[index];
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
concat(items) {
|
|
139
|
-
if (items) {
|
|
140
|
-
for (const item of items) {
|
|
141
|
-
this.hashedArray[item[this.uniqueProperty]] = item;
|
|
142
|
-
}
|
|
143
|
-
this.array.concat(items);
|
|
144
|
-
}
|
|
145
|
-
return this;
|
|
146
|
-
}
|
|
147
|
-
find(predicate, thisArg) {
|
|
148
|
-
return this.array.find(predicate, thisArg);
|
|
149
|
-
}
|
|
150
|
-
filter(predicate, thisArg) {
|
|
151
|
-
return this.array.filter(predicate, thisArg);
|
|
152
|
-
}
|
|
153
|
-
forEach(callbackfn, thisArg) {
|
|
154
|
-
Array.prototype.forEach.call(this.array, callbackfn);
|
|
155
|
-
}
|
|
156
|
-
get(key) {
|
|
157
|
-
return this.hashedArray[key];
|
|
158
|
-
}
|
|
159
|
-
includes(element) {
|
|
160
|
-
return this.hashedArray[element[this.uniqueProperty]] !== void 0;
|
|
161
|
-
}
|
|
162
|
-
indexOf(element) {
|
|
163
|
-
return this.array.indexOf(element);
|
|
164
|
-
}
|
|
165
|
-
map(callback) {
|
|
166
|
-
const result = [];
|
|
167
|
-
for (let index = 0; index < this.array.length; index++) {
|
|
168
|
-
result.push(callback(this.array[index], index, this.array));
|
|
169
|
-
}
|
|
170
|
-
return result;
|
|
171
|
-
}
|
|
172
|
-
deleteAt(index) {
|
|
173
|
-
if (index >= this.array.length) {
|
|
174
|
-
this._badIndexWarning(index);
|
|
175
|
-
return void 0;
|
|
176
|
-
} else {
|
|
177
|
-
const removable = this.spliceOne(index);
|
|
178
|
-
delete this.hashedArray[removable[this.uniqueProperty]];
|
|
179
|
-
return removable;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
deleteByKey(key) {
|
|
183
|
-
if (!this.hashedArray[key]) {
|
|
184
|
-
import_Logger.logger.error(`deleteByKey(): no such element for '${key}'.`);
|
|
185
|
-
return void 0;
|
|
186
|
-
} else {
|
|
187
|
-
const removable = this.spliceOne(this.indexOf(this.hashedArray[key]));
|
|
188
|
-
delete this.hashedArray[key];
|
|
189
|
-
return removable;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
delete(obj) {
|
|
193
|
-
if (this.hashedArray[obj[this.uniqueProperty]]) {
|
|
194
|
-
return this.deleteByKey(obj[this.uniqueProperty]);
|
|
195
|
-
} else if (this.indexOf(obj) != -1) {
|
|
196
|
-
return this.deleteAt(this.indexOf(obj));
|
|
197
|
-
} else {
|
|
198
|
-
return void 0;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
_badIndexWarning(index) {
|
|
202
|
-
import_Logger.logger.warn(`Index out of range, index: ${index}`);
|
|
203
|
-
}
|
|
204
|
-
spliceOne(index) {
|
|
205
|
-
if (index === -1 || index >= this.array.length) {
|
|
206
|
-
this._badIndexWarning(index);
|
|
207
|
-
return void 0;
|
|
208
|
-
}
|
|
209
|
-
const itemRemoved = this.array[index];
|
|
210
|
-
const len = this.array.length - 1;
|
|
211
|
-
for (let i = index; i < len; i++) {
|
|
212
|
-
this.array[i] = this.array[i + 1];
|
|
213
|
-
}
|
|
214
|
-
this.array.length = len;
|
|
215
|
-
return itemRemoved;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
105
|
class DummyServer extends import_events.EventEmitter {
|
|
219
106
|
}
|
|
220
107
|
(0, import_msgpackr.addExtension)({
|
|
@@ -231,7 +118,6 @@ class DummyServer extends import_events.EventEmitter {
|
|
|
231
118
|
0 && (module.exports = {
|
|
232
119
|
Deferred,
|
|
233
120
|
DummyServer,
|
|
234
|
-
HybridArray,
|
|
235
121
|
REMOTE_ROOM_SHORT_TIMEOUT,
|
|
236
122
|
generateId,
|
|
237
123
|
merge,
|