@colyseus/core 0.15.0-preview.2 → 0.15.0-preview.4

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.
@@ -8,6 +8,7 @@ export declare enum Protocol {
8
8
  ROOM_STATE = 14,
9
9
  ROOM_STATE_PATCH = 15,
10
10
  ROOM_DATA_SCHEMA = 16,
11
+ ROOM_DATA_BYTES = 17,
11
12
  WS_CLOSE_NORMAL = 1000,
12
13
  WS_CLOSE_CONSENTED = 4000,
13
14
  WS_CLOSE_WITH_ERROR = 4002,
@@ -33,7 +34,7 @@ export declare const getMessageBytes: {
33
34
  11: (code: number, message?: string) => Protocol[];
34
35
  14: (bytes: number[]) => number[];
35
36
  16: (message: Schema) => number[];
36
- 13: (type: string | number, message?: any) => Uint8Array;
37
+ raw: (code: Protocol, type: string | number, message?: any, rawMessage?: ArrayLike<number> | Buffer) => Uint8Array;
37
38
  };
38
39
  export declare function utf8Write(buff: Buffer, offset: number, str?: string): void;
39
40
  export declare function utf8Length(str?: string): number;
package/build/Protocol.js CHANGED
@@ -21,6 +21,7 @@ exports.Protocol = void 0;
21
21
  Protocol[Protocol["ROOM_STATE"] = 14] = "ROOM_STATE";
22
22
  Protocol[Protocol["ROOM_STATE_PATCH"] = 15] = "ROOM_STATE_PATCH";
23
23
  Protocol[Protocol["ROOM_DATA_SCHEMA"] = 16] = "ROOM_DATA_SCHEMA";
24
+ Protocol[Protocol["ROOM_DATA_BYTES"] = 17] = "ROOM_DATA_BYTES";
24
25
  // WebSocket close codes (https://github.com/Luka967/websocket-close-codes)
25
26
  Protocol[Protocol["WS_CLOSE_NORMAL"] = 1000] = "WS_CLOSE_NORMAL";
26
27
  // WebSocket error codes
@@ -83,8 +84,8 @@ const getMessageBytes = {
83
84
  }
84
85
  return [exports.Protocol.ROOM_DATA_SCHEMA, typeid, ...message.encodeAll()];
85
86
  },
86
- [exports.Protocol.ROOM_DATA]: (type, message) => {
87
- const initialBytes = [exports.Protocol.ROOM_DATA];
87
+ raw: (code, type, message, rawMessage) => {
88
+ const initialBytes = [code];
88
89
  const messageType = typeof (type);
89
90
  if (messageType === 'string') {
90
91
  schema.encode.string(initialBytes, type);
@@ -102,6 +103,11 @@ const getMessageBytes = {
102
103
  arr.set(new Uint8Array(initialBytes), 0);
103
104
  arr.set(new Uint8Array(encoded), initialBytes.length);
104
105
  }
106
+ else if (rawMessage !== undefined) {
107
+ arr = new Uint8Array(initialBytes.length + (rawMessage.byteLength || rawMessage.length));
108
+ arr.set(new Uint8Array(initialBytes), 0);
109
+ arr.set(new Uint8Array(rawMessage), initialBytes.length);
110
+ }
105
111
  else {
106
112
  arr = new Uint8Array(initialBytes);
107
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Protocol.js","sources":["../src/Protocol.ts"],"sourcesContent":["import msgpack from 'notepack.io';\nimport { encode, Schema } from '@colyseus/schema';\nimport { logger } from './Logger';\n\n// Colyseus protocol codes range between 0~100\nexport enum Protocol {\n // Room-related (10~19)\n JOIN_ROOM = 10,\n ERROR = 11,\n LEAVE_ROOM = 12,\n ROOM_DATA = 13,\n ROOM_STATE = 14,\n ROOM_STATE_PATCH = 15,\n ROOM_DATA_SCHEMA = 16, // used to send schema instances via room.send()\n\n // WebSocket close codes (https://github.com/Luka967/websocket-close-codes)\n WS_CLOSE_NORMAL = 1000,\n\n // WebSocket error codes\n WS_CLOSE_CONSENTED = 4000,\n WS_CLOSE_WITH_ERROR = 4002,\n WS_SERVER_DISCONNECT = 4201,\n WS_TOO_MANY_CLIENTS = 4202,\n}\n\nexport enum ErrorCode {\n // MatchMaking Error Codes\n MATCHMAKE_NO_HANDLER = 4210,\n MATCHMAKE_INVALID_CRITERIA = 4211,\n MATCHMAKE_INVALID_ROOM_ID = 4212,\n MATCHMAKE_UNHANDLED = 4213, // generic exception during onCreate/onJoin\n MATCHMAKE_EXPIRED = 4214, // generic exception during onCreate/onJoin\n\n AUTH_FAILED = 4215,\n APPLICATION_ERROR = 4216,\n}\n\n// Inter-process communication protocol\nexport enum IpcProtocol {\n SUCCESS = 0,\n ERROR = 1,\n TIMEOUT = 2,\n}\n\nexport const getMessageBytes = {\n [Protocol.JOIN_ROOM]: (reconnectionToken: string, serializerId: string, handshake?: number[]) => {\n let offset = 0;\n\n const reconnectionTokenLength = utf8Length(reconnectionToken);\n const serializerIdLength = utf8Length(serializerId);\n const handshakeLength = (handshake) ? handshake.length : 0;\n\n const buff = Buffer.allocUnsafe(1 + reconnectionTokenLength + serializerIdLength + handshakeLength);\n buff.writeUInt8(Protocol.JOIN_ROOM, offset++);\n\n utf8Write(buff, offset, reconnectionToken);\n offset += reconnectionTokenLength;\n\n utf8Write(buff, offset, serializerId);\n offset += serializerIdLength;\n\n if (handshake) {\n for (let i = 0, l = handshake.length; i < l; i++) {\n buff.writeUInt8(handshake[i], offset++);\n }\n }\n\n return buff;\n },\n\n [Protocol.ERROR]: (code: number, message: string = '') => {\n const bytes = [Protocol.ERROR];\n\n encode.number(bytes, code);\n encode.string(bytes, message);\n\n return bytes;\n },\n\n [Protocol.ROOM_STATE]: (bytes: number[]) => {\n return [Protocol.ROOM_STATE, ...bytes];\n },\n\n [Protocol.ROOM_DATA_SCHEMA]: (message: Schema) => {\n const typeid = (message.constructor as typeof Schema)._typeid;\n\n if (typeid === undefined) {\n logger.warn('Starting at colyseus >= 0.13 You must provide a type and message when calling `this.broadcast()` or `client.send()`. Please see: https://docs.colyseus.io/migrating/0.13/');\n throw new Error(`an instance of Schema was expected, but ${JSON.stringify(message)} has been provided.`);\n }\n\n return [Protocol.ROOM_DATA_SCHEMA, typeid, ...message.encodeAll()];\n },\n\n [Protocol.ROOM_DATA]: (type: string | number, message?: any) => {\n const initialBytes: number[] = [Protocol.ROOM_DATA];\n const messageType = typeof (type);\n\n if (messageType === 'string') {\n encode.string(initialBytes, type);\n\n } else if (messageType === 'number') {\n encode.number(initialBytes, type);\n\n } else {\n throw new Error(`Protocol.ROOM_DATA: message type not supported \"${type.toString()}\"`);\n }\n\n let arr: Uint8Array;\n\n if (message !== undefined) {\n const encoded = msgpack.encode(message);\n arr = new Uint8Array(initialBytes.length + encoded.byteLength);\n arr.set(new Uint8Array(initialBytes), 0);\n arr.set(new Uint8Array(encoded), initialBytes.length);\n\n } else {\n arr = new Uint8Array(initialBytes);\n }\n\n return arr;\n },\n};\n\nexport function utf8Write(buff: Buffer, offset: number, str: string = '') {\n buff[offset++] = utf8Length(str) - 1;\n\n let c = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n buff[offset++] = c;\n } else if (c < 0x800) {\n buff[offset++] = 0xc0 | (c >> 6);\n buff[offset++] = 0x80 | (c & 0x3f);\n } else if (c < 0xd800 || c >= 0xe000) {\n buff[offset++] = 0xe0 | (c >> 12);\n buff[offset++] = 0x80 | (c >> 6) & 0x3f;\n buff[offset++] = 0x80 | (c & 0x3f);\n } else {\n i++;\n c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n buff[offset++] = 0xf0 | (c >> 18);\n buff[offset++] = 0x80 | (c >> 12) & 0x3f;\n buff[offset++] = 0x80 | (c >> 6) & 0x3f;\n buff[offset++] = 0x80 | (c & 0x3f);\n }\n }\n}\n\n// Faster for short strings than Buffer.byteLength\nexport function utf8Length(str: string = '') {\n let c = 0;\n let length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n } else if (c < 0x800) {\n length += 2;\n } else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n } else {\n i++;\n length += 4;\n }\n }\n return length + 1;\n}\n"],"names":["Protocol","ErrorCode","IpcProtocol","encode","logger","msgpack"],"mappings":"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"}
1
+ {"version":3,"file":"Protocol.js","sources":["../src/Protocol.ts"],"sourcesContent":["import msgpack from 'notepack.io';\nimport { encode, Schema } from '@colyseus/schema';\nimport { logger } from './Logger';\n\n// Colyseus protocol codes range between 0~100\nexport enum Protocol {\n // Room-related (10~19)\n JOIN_ROOM = 10,\n ERROR = 11,\n LEAVE_ROOM = 12,\n ROOM_DATA = 13,\n ROOM_STATE = 14,\n ROOM_STATE_PATCH = 15,\n ROOM_DATA_SCHEMA = 16, // used to send schema instances via room.send()\n ROOM_DATA_BYTES = 17,\n\n // WebSocket close codes (https://github.com/Luka967/websocket-close-codes)\n WS_CLOSE_NORMAL = 1000,\n\n // WebSocket error codes\n WS_CLOSE_CONSENTED = 4000,\n WS_CLOSE_WITH_ERROR = 4002,\n WS_SERVER_DISCONNECT = 4201,\n WS_TOO_MANY_CLIENTS = 4202,\n}\n\nexport enum ErrorCode {\n // MatchMaking Error Codes\n MATCHMAKE_NO_HANDLER = 4210,\n MATCHMAKE_INVALID_CRITERIA = 4211,\n MATCHMAKE_INVALID_ROOM_ID = 4212,\n MATCHMAKE_UNHANDLED = 4213, // generic exception during onCreate/onJoin\n MATCHMAKE_EXPIRED = 4214, // generic exception during onCreate/onJoin\n\n AUTH_FAILED = 4215,\n APPLICATION_ERROR = 4216,\n}\n\n// Inter-process communication protocol\nexport enum IpcProtocol {\n SUCCESS = 0,\n ERROR = 1,\n TIMEOUT = 2,\n}\n\nexport const getMessageBytes = {\n [Protocol.JOIN_ROOM]: (reconnectionToken: string, serializerId: string, handshake?: number[]) => {\n let offset = 0;\n\n const reconnectionTokenLength = utf8Length(reconnectionToken);\n const serializerIdLength = utf8Length(serializerId);\n const handshakeLength = (handshake) ? handshake.length : 0;\n\n const buff = Buffer.allocUnsafe(1 + reconnectionTokenLength + serializerIdLength + handshakeLength);\n buff.writeUInt8(Protocol.JOIN_ROOM, offset++);\n\n utf8Write(buff, offset, reconnectionToken);\n offset += reconnectionTokenLength;\n\n utf8Write(buff, offset, serializerId);\n offset += serializerIdLength;\n\n if (handshake) {\n for (let i = 0, l = handshake.length; i < l; i++) {\n buff.writeUInt8(handshake[i], offset++);\n }\n }\n\n return buff;\n },\n\n [Protocol.ERROR]: (code: number, message: string = '') => {\n const bytes = [Protocol.ERROR];\n\n encode.number(bytes, code);\n encode.string(bytes, message);\n\n return bytes;\n },\n\n [Protocol.ROOM_STATE]: (bytes: number[]) => {\n return [Protocol.ROOM_STATE, ...bytes];\n },\n\n [Protocol.ROOM_DATA_SCHEMA]: (message: Schema) => {\n const typeid = (message.constructor as typeof Schema)._typeid;\n\n if (typeid === undefined) {\n logger.warn('Starting at colyseus >= 0.13 You must provide a type and message when calling `this.broadcast()` or `client.send()`. Please see: https://docs.colyseus.io/migrating/0.13/');\n throw new Error(`an instance of Schema was expected, but ${JSON.stringify(message)} has been provided.`);\n }\n\n return [Protocol.ROOM_DATA_SCHEMA, typeid, ...message.encodeAll()];\n },\n\n raw: (code: Protocol, type: string | number, message?: any, rawMessage?: ArrayLike<number> | Buffer) => {\n const initialBytes: number[] = [code];\n const messageType = typeof (type);\n\n if (messageType === 'string') {\n encode.string(initialBytes, type);\n\n } else if (messageType === 'number') {\n encode.number(initialBytes, type);\n\n } else {\n throw new Error(`Protocol.ROOM_DATA: message type not supported \"${type.toString()}\"`);\n }\n\n let arr: Uint8Array;\n\n if (message !== undefined) {\n const encoded = msgpack.encode(message);\n arr = new Uint8Array(initialBytes.length + encoded.byteLength);\n arr.set(new Uint8Array(initialBytes), 0);\n arr.set(new Uint8Array(encoded), initialBytes.length);\n\n } else if (rawMessage !== undefined) {\n arr = new Uint8Array(initialBytes.length + ((rawMessage as Buffer).byteLength || rawMessage.length));\n arr.set(new Uint8Array(initialBytes), 0);\n arr.set(new Uint8Array(rawMessage), initialBytes.length);\n\n } else {\n arr = new Uint8Array(initialBytes);\n }\n\n return arr;\n },\n\n};\n\nexport function utf8Write(buff: Buffer, offset: number, str: string = '') {\n buff[offset++] = utf8Length(str) - 1;\n\n let c = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n buff[offset++] = c;\n } else if (c < 0x800) {\n buff[offset++] = 0xc0 | (c >> 6);\n buff[offset++] = 0x80 | (c & 0x3f);\n } else if (c < 0xd800 || c >= 0xe000) {\n buff[offset++] = 0xe0 | (c >> 12);\n buff[offset++] = 0x80 | (c >> 6) & 0x3f;\n buff[offset++] = 0x80 | (c & 0x3f);\n } else {\n i++;\n c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n buff[offset++] = 0xf0 | (c >> 18);\n buff[offset++] = 0x80 | (c >> 12) & 0x3f;\n buff[offset++] = 0x80 | (c >> 6) & 0x3f;\n buff[offset++] = 0x80 | (c & 0x3f);\n }\n }\n}\n\n// Faster for short strings than Buffer.byteLength\nexport function utf8Length(str: string = '') {\n let c = 0;\n let length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n } else if (c < 0x800) {\n length += 2;\n } else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n } else {\n i++;\n length += 4;\n }\n }\n return length + 1;\n}\n"],"names":["Protocol","ErrorCode","IpcProtocol","encode","logger","msgpack"],"mappings":"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"}
@@ -13,6 +13,7 @@ var Protocol;
13
13
  Protocol[Protocol["ROOM_STATE"] = 14] = "ROOM_STATE";
14
14
  Protocol[Protocol["ROOM_STATE_PATCH"] = 15] = "ROOM_STATE_PATCH";
15
15
  Protocol[Protocol["ROOM_DATA_SCHEMA"] = 16] = "ROOM_DATA_SCHEMA";
16
+ Protocol[Protocol["ROOM_DATA_BYTES"] = 17] = "ROOM_DATA_BYTES";
16
17
  // WebSocket close codes (https://github.com/Luka967/websocket-close-codes)
17
18
  Protocol[Protocol["WS_CLOSE_NORMAL"] = 1000] = "WS_CLOSE_NORMAL";
18
19
  // WebSocket error codes
@@ -75,8 +76,8 @@ const getMessageBytes = {
75
76
  }
76
77
  return [Protocol.ROOM_DATA_SCHEMA, typeid, ...message.encodeAll()];
77
78
  },
78
- [Protocol.ROOM_DATA]: (type, message) => {
79
- const initialBytes = [Protocol.ROOM_DATA];
79
+ raw: (code, type, message, rawMessage) => {
80
+ const initialBytes = [code];
80
81
  const messageType = typeof (type);
81
82
  if (messageType === 'string') {
82
83
  encode.string(initialBytes, type);
@@ -94,6 +95,11 @@ const getMessageBytes = {
94
95
  arr.set(new Uint8Array(initialBytes), 0);
95
96
  arr.set(new Uint8Array(encoded), initialBytes.length);
96
97
  }
98
+ else if (rawMessage !== undefined) {
99
+ arr = new Uint8Array(initialBytes.length + (rawMessage.byteLength || rawMessage.length));
100
+ arr.set(new Uint8Array(initialBytes), 0);
101
+ arr.set(new Uint8Array(rawMessage), initialBytes.length);
102
+ }
97
103
  else {
98
104
  arr = new Uint8Array(initialBytes);
99
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Protocol.mjs","sources":["../src/Protocol.ts"],"sourcesContent":["import msgpack from 'notepack.io';\nimport { encode, Schema } from '@colyseus/schema';\nimport { logger } from './Logger';\n\n// Colyseus protocol codes range between 0~100\nexport enum Protocol {\n // Room-related (10~19)\n JOIN_ROOM = 10,\n ERROR = 11,\n LEAVE_ROOM = 12,\n ROOM_DATA = 13,\n ROOM_STATE = 14,\n ROOM_STATE_PATCH = 15,\n ROOM_DATA_SCHEMA = 16, // used to send schema instances via room.send()\n\n // WebSocket close codes (https://github.com/Luka967/websocket-close-codes)\n WS_CLOSE_NORMAL = 1000,\n\n // WebSocket error codes\n WS_CLOSE_CONSENTED = 4000,\n WS_CLOSE_WITH_ERROR = 4002,\n WS_SERVER_DISCONNECT = 4201,\n WS_TOO_MANY_CLIENTS = 4202,\n}\n\nexport enum ErrorCode {\n // MatchMaking Error Codes\n MATCHMAKE_NO_HANDLER = 4210,\n MATCHMAKE_INVALID_CRITERIA = 4211,\n MATCHMAKE_INVALID_ROOM_ID = 4212,\n MATCHMAKE_UNHANDLED = 4213, // generic exception during onCreate/onJoin\n MATCHMAKE_EXPIRED = 4214, // generic exception during onCreate/onJoin\n\n AUTH_FAILED = 4215,\n APPLICATION_ERROR = 4216,\n}\n\n// Inter-process communication protocol\nexport enum IpcProtocol {\n SUCCESS = 0,\n ERROR = 1,\n TIMEOUT = 2,\n}\n\nexport const getMessageBytes = {\n [Protocol.JOIN_ROOM]: (reconnectionToken: string, serializerId: string, handshake?: number[]) => {\n let offset = 0;\n\n const reconnectionTokenLength = utf8Length(reconnectionToken);\n const serializerIdLength = utf8Length(serializerId);\n const handshakeLength = (handshake) ? handshake.length : 0;\n\n const buff = Buffer.allocUnsafe(1 + reconnectionTokenLength + serializerIdLength + handshakeLength);\n buff.writeUInt8(Protocol.JOIN_ROOM, offset++);\n\n utf8Write(buff, offset, reconnectionToken);\n offset += reconnectionTokenLength;\n\n utf8Write(buff, offset, serializerId);\n offset += serializerIdLength;\n\n if (handshake) {\n for (let i = 0, l = handshake.length; i < l; i++) {\n buff.writeUInt8(handshake[i], offset++);\n }\n }\n\n return buff;\n },\n\n [Protocol.ERROR]: (code: number, message: string = '') => {\n const bytes = [Protocol.ERROR];\n\n encode.number(bytes, code);\n encode.string(bytes, message);\n\n return bytes;\n },\n\n [Protocol.ROOM_STATE]: (bytes: number[]) => {\n return [Protocol.ROOM_STATE, ...bytes];\n },\n\n [Protocol.ROOM_DATA_SCHEMA]: (message: Schema) => {\n const typeid = (message.constructor as typeof Schema)._typeid;\n\n if (typeid === undefined) {\n logger.warn('Starting at colyseus >= 0.13 You must provide a type and message when calling `this.broadcast()` or `client.send()`. Please see: https://docs.colyseus.io/migrating/0.13/');\n throw new Error(`an instance of Schema was expected, but ${JSON.stringify(message)} has been provided.`);\n }\n\n return [Protocol.ROOM_DATA_SCHEMA, typeid, ...message.encodeAll()];\n },\n\n [Protocol.ROOM_DATA]: (type: string | number, message?: any) => {\n const initialBytes: number[] = [Protocol.ROOM_DATA];\n const messageType = typeof (type);\n\n if (messageType === 'string') {\n encode.string(initialBytes, type);\n\n } else if (messageType === 'number') {\n encode.number(initialBytes, type);\n\n } else {\n throw new Error(`Protocol.ROOM_DATA: message type not supported \"${type.toString()}\"`);\n }\n\n let arr: Uint8Array;\n\n if (message !== undefined) {\n const encoded = msgpack.encode(message);\n arr = new Uint8Array(initialBytes.length + encoded.byteLength);\n arr.set(new Uint8Array(initialBytes), 0);\n arr.set(new Uint8Array(encoded), initialBytes.length);\n\n } else {\n arr = new Uint8Array(initialBytes);\n }\n\n return arr;\n },\n};\n\nexport function utf8Write(buff: Buffer, offset: number, str: string = '') {\n buff[offset++] = utf8Length(str) - 1;\n\n let c = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n buff[offset++] = c;\n } else if (c < 0x800) {\n buff[offset++] = 0xc0 | (c >> 6);\n buff[offset++] = 0x80 | (c & 0x3f);\n } else if (c < 0xd800 || c >= 0xe000) {\n buff[offset++] = 0xe0 | (c >> 12);\n buff[offset++] = 0x80 | (c >> 6) & 0x3f;\n buff[offset++] = 0x80 | (c & 0x3f);\n } else {\n i++;\n c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n buff[offset++] = 0xf0 | (c >> 18);\n buff[offset++] = 0x80 | (c >> 12) & 0x3f;\n buff[offset++] = 0x80 | (c >> 6) & 0x3f;\n buff[offset++] = 0x80 | (c & 0x3f);\n }\n }\n}\n\n// Faster for short strings than Buffer.byteLength\nexport function utf8Length(str: string = '') {\n let c = 0;\n let length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n } else if (c < 0x800) {\n length += 2;\n } else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n } else {\n i++;\n length += 4;\n }\n }\n return length + 1;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Protocol.mjs","sources":["../src/Protocol.ts"],"sourcesContent":["import msgpack from 'notepack.io';\nimport { encode, Schema } from '@colyseus/schema';\nimport { logger } from './Logger';\n\n// Colyseus protocol codes range between 0~100\nexport enum Protocol {\n // Room-related (10~19)\n JOIN_ROOM = 10,\n ERROR = 11,\n LEAVE_ROOM = 12,\n ROOM_DATA = 13,\n ROOM_STATE = 14,\n ROOM_STATE_PATCH = 15,\n ROOM_DATA_SCHEMA = 16, // used to send schema instances via room.send()\n ROOM_DATA_BYTES = 17,\n\n // WebSocket close codes (https://github.com/Luka967/websocket-close-codes)\n WS_CLOSE_NORMAL = 1000,\n\n // WebSocket error codes\n WS_CLOSE_CONSENTED = 4000,\n WS_CLOSE_WITH_ERROR = 4002,\n WS_SERVER_DISCONNECT = 4201,\n WS_TOO_MANY_CLIENTS = 4202,\n}\n\nexport enum ErrorCode {\n // MatchMaking Error Codes\n MATCHMAKE_NO_HANDLER = 4210,\n MATCHMAKE_INVALID_CRITERIA = 4211,\n MATCHMAKE_INVALID_ROOM_ID = 4212,\n MATCHMAKE_UNHANDLED = 4213, // generic exception during onCreate/onJoin\n MATCHMAKE_EXPIRED = 4214, // generic exception during onCreate/onJoin\n\n AUTH_FAILED = 4215,\n APPLICATION_ERROR = 4216,\n}\n\n// Inter-process communication protocol\nexport enum IpcProtocol {\n SUCCESS = 0,\n ERROR = 1,\n TIMEOUT = 2,\n}\n\nexport const getMessageBytes = {\n [Protocol.JOIN_ROOM]: (reconnectionToken: string, serializerId: string, handshake?: number[]) => {\n let offset = 0;\n\n const reconnectionTokenLength = utf8Length(reconnectionToken);\n const serializerIdLength = utf8Length(serializerId);\n const handshakeLength = (handshake) ? handshake.length : 0;\n\n const buff = Buffer.allocUnsafe(1 + reconnectionTokenLength + serializerIdLength + handshakeLength);\n buff.writeUInt8(Protocol.JOIN_ROOM, offset++);\n\n utf8Write(buff, offset, reconnectionToken);\n offset += reconnectionTokenLength;\n\n utf8Write(buff, offset, serializerId);\n offset += serializerIdLength;\n\n if (handshake) {\n for (let i = 0, l = handshake.length; i < l; i++) {\n buff.writeUInt8(handshake[i], offset++);\n }\n }\n\n return buff;\n },\n\n [Protocol.ERROR]: (code: number, message: string = '') => {\n const bytes = [Protocol.ERROR];\n\n encode.number(bytes, code);\n encode.string(bytes, message);\n\n return bytes;\n },\n\n [Protocol.ROOM_STATE]: (bytes: number[]) => {\n return [Protocol.ROOM_STATE, ...bytes];\n },\n\n [Protocol.ROOM_DATA_SCHEMA]: (message: Schema) => {\n const typeid = (message.constructor as typeof Schema)._typeid;\n\n if (typeid === undefined) {\n logger.warn('Starting at colyseus >= 0.13 You must provide a type and message when calling `this.broadcast()` or `client.send()`. Please see: https://docs.colyseus.io/migrating/0.13/');\n throw new Error(`an instance of Schema was expected, but ${JSON.stringify(message)} has been provided.`);\n }\n\n return [Protocol.ROOM_DATA_SCHEMA, typeid, ...message.encodeAll()];\n },\n\n raw: (code: Protocol, type: string | number, message?: any, rawMessage?: ArrayLike<number> | Buffer) => {\n const initialBytes: number[] = [code];\n const messageType = typeof (type);\n\n if (messageType === 'string') {\n encode.string(initialBytes, type);\n\n } else if (messageType === 'number') {\n encode.number(initialBytes, type);\n\n } else {\n throw new Error(`Protocol.ROOM_DATA: message type not supported \"${type.toString()}\"`);\n }\n\n let arr: Uint8Array;\n\n if (message !== undefined) {\n const encoded = msgpack.encode(message);\n arr = new Uint8Array(initialBytes.length + encoded.byteLength);\n arr.set(new Uint8Array(initialBytes), 0);\n arr.set(new Uint8Array(encoded), initialBytes.length);\n\n } else if (rawMessage !== undefined) {\n arr = new Uint8Array(initialBytes.length + ((rawMessage as Buffer).byteLength || rawMessage.length));\n arr.set(new Uint8Array(initialBytes), 0);\n arr.set(new Uint8Array(rawMessage), initialBytes.length);\n\n } else {\n arr = new Uint8Array(initialBytes);\n }\n\n return arr;\n },\n\n};\n\nexport function utf8Write(buff: Buffer, offset: number, str: string = '') {\n buff[offset++] = utf8Length(str) - 1;\n\n let c = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n buff[offset++] = c;\n } else if (c < 0x800) {\n buff[offset++] = 0xc0 | (c >> 6);\n buff[offset++] = 0x80 | (c & 0x3f);\n } else if (c < 0xd800 || c >= 0xe000) {\n buff[offset++] = 0xe0 | (c >> 12);\n buff[offset++] = 0x80 | (c >> 6) & 0x3f;\n buff[offset++] = 0x80 | (c & 0x3f);\n } else {\n i++;\n c = 0x10000 + (((c & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n buff[offset++] = 0xf0 | (c >> 18);\n buff[offset++] = 0x80 | (c >> 12) & 0x3f;\n buff[offset++] = 0x80 | (c >> 6) & 0x3f;\n buff[offset++] = 0x80 | (c & 0x3f);\n }\n }\n}\n\n// Faster for short strings than Buffer.byteLength\nexport function utf8Length(str: string = '') {\n let c = 0;\n let length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n } else if (c < 0x800) {\n length += 2;\n } else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n } else {\n i++;\n length += 4;\n }\n }\n return length + 1;\n}\n"],"names":[],"mappings":";;;;AAIA;IACY;AAAZ,WAAY,QAAQ;;IAElB,kDAAc,CAAA;IACd,0CAAU,CAAA;IACV,oDAAe,CAAA;IACf,kDAAc,CAAA;IACd,oDAAe,CAAA;IACf,gEAAqB,CAAA;IACrB,gEAAqB,CAAA;IACrB,8DAAoB,CAAA;;IAGpB,gEAAsB,CAAA;;IAGtB,sEAAyB,CAAA;IACzB,wEAA0B,CAAA;IAC1B,0EAA2B,CAAA;IAC3B,wEAA0B,CAAA;AAC5B,CAAC,EAnBW,QAAQ,KAAR,QAAQ,QAmBnB;IAEW;AAAZ,WAAY,SAAS;;IAEnB,4EAA2B,CAAA;IAC3B,wFAAiC,CAAA;IACjC,sFAAgC,CAAA;IAChC,0EAA0B,CAAA;IAC1B,sEAAwB,CAAA;IAExB,0DAAkB,CAAA;IAClB,sEAAwB,CAAA;AAC1B,CAAC,EAVW,SAAS,KAAT,SAAS,QAUpB;AAED;IACY;AAAZ,WAAY,WAAW;IACrB,mDAAW,CAAA;IACX,+CAAS,CAAA;IACT,mDAAW,CAAA;AACb,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;MAEY,eAAe,GAAG;IAC7B,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,iBAAyB,EAAE,YAAoB,EAAE,SAAoB;QAC1F,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,MAAM,uBAAuB,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC9D,MAAM,kBAAkB,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,uBAAuB,GAAG,kBAAkB,GAAG,eAAe,CAAC,CAAC;QACpG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC3C,MAAM,IAAI,uBAAuB,CAAC;QAElC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACtC,MAAM,IAAI,kBAAkB,CAAC;QAE7B,IAAI,SAAS,EAAE;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;aACzC;SACF;QAED,OAAO,IAAI,CAAC;KACb;IAED,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAE;QACnD,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE9B,OAAO,KAAK,CAAC;KACd;IAED,CAAC,QAAQ,CAAC,UAAU,GAAG,CAAC,KAAe;QACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC;KACxC;IAED,CAAC,QAAQ,CAAC,gBAAgB,GAAG,CAAC,OAAe;QAC3C,MAAM,MAAM,GAAI,OAAO,CAAC,WAA6B,CAAC,OAAO,CAAC;QAE9D,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,MAAM,CAAC,IAAI,CAAC,2KAA2K,CAAC,CAAC;YACzL,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;SAC1G;QAED,OAAO,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;KACpE;IAED,GAAG,EAAE,CAAC,IAAc,EAAE,IAAqB,EAAE,OAAa,EAAE,UAAuC;QACjG,MAAM,YAAY,GAAa,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,QAAQ,IAAI,CAAC,CAAC;QAElC,IAAI,WAAW,KAAK,QAAQ,EAAE;YAC5B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;SAEnC;aAAM,IAAI,WAAW,KAAK,QAAQ,EAAE;YACnC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;SAEnC;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,mDAAmD,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;SACxF;QAED,IAAI,GAAe,CAAC;QAEpB,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,GAAG,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YAC/D,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;YACzC,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;SAEvD;aAAM,IAAI,UAAU,KAAK,SAAS,EAAE;YACnC,GAAG,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,IAAK,UAAqB,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;YACrG,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;YACzC,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;SAE1D;aAAM;YACL,GAAG,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;SACpC;QAED,OAAO,GAAG,CAAC;KACZ;EAED;SAEc,SAAS,CAAC,IAAY,EAAE,MAAc,EAAE,MAAc,EAAE;IACtE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1C,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,IAAI,EAAE;YACZ,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;SACpB;aAAM,IAAI,CAAC,GAAG,KAAK,EAAE;YACpB,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;SACpC;aAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,MAAM,EAAE;YACpC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;SACpC;aAAM;YACL,CAAC,EAAE,CAAC;YACJ,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;SACpC;KACF;AACH,CAAC;AAED;SACgB,UAAU,CAAC,MAAc,EAAE;IACzC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1C,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,IAAI,EAAE;YACZ,MAAM,IAAI,CAAC,CAAC;SACb;aAAM,IAAI,CAAC,GAAG,KAAK,EAAE;YACpB,MAAM,IAAI,CAAC,CAAC;SACb;aAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,MAAM,EAAE;YACpC,MAAM,IAAI,CAAC,CAAC;SACb;aAAM;YACL,CAAC,EAAE,CAAC;YACJ,MAAM,IAAI,CAAC,CAAC;SACb;KACF;IACD,OAAO,MAAM,GAAG,CAAC,CAAC;AACpB;;;;"}
package/build/Room.d.ts CHANGED
@@ -12,7 +12,7 @@ export declare const DEFAULT_SEAT_RESERVATION_TIME: number;
12
12
  export declare type SimulationCallback = (deltaTime: number) => void;
13
13
  export declare type RoomConstructor<T = any> = new (presence?: Presence) => Room<T>;
14
14
  export interface IBroadcastOptions extends ISendOptions {
15
- except?: Client;
15
+ except?: Client | Client[];
16
16
  }
17
17
  export declare enum RoomInternalState {
18
18
  CREATING = 0,
package/build/Room.js CHANGED
@@ -392,21 +392,31 @@ class Room {
392
392
  broadcastMessageSchema(message, options = {}) {
393
393
  Debug.debugMessage("broadcast: %O", message);
394
394
  const encodedMessage = Protocol.getMessageBytes[Protocol.Protocol.ROOM_DATA_SCHEMA](message);
395
+ const except = (typeof (options.except) !== "undefined")
396
+ ? Array.isArray(options.except)
397
+ ? options.except
398
+ : [options.except]
399
+ : undefined;
395
400
  let numClients = this.clients.length;
396
401
  while (numClients--) {
397
402
  const client = this.clients.array[numClients];
398
- if (options.except !== client) {
403
+ if (!except || !except.includes(client)) {
399
404
  client.enqueueRaw(encodedMessage);
400
405
  }
401
406
  }
402
407
  }
403
408
  broadcastMessageType(type, message, options = {}) {
404
409
  Debug.debugMessage("broadcast: %O", message);
405
- const encodedMessage = Protocol.getMessageBytes[Protocol.Protocol.ROOM_DATA](type, message);
410
+ const encodedMessage = Protocol.getMessageBytes.raw(Protocol.Protocol.ROOM_DATA, type, message);
411
+ const except = (typeof (options.except) !== "undefined")
412
+ ? Array.isArray(options.except)
413
+ ? options.except
414
+ : [options.except]
415
+ : undefined;
406
416
  let numClients = this.clients.length;
407
417
  while (numClients--) {
408
418
  const client = this.clients.array[numClients];
409
- if (options.except !== client) {
419
+ if (!except || !except.includes(client)) {
410
420
  client.enqueueRaw(encodedMessage);
411
421
  }
412
422
  }
@@ -515,6 +525,22 @@ class Room {
515
525
  Debug.debugAndPrintError(`onMessage for "${messageType}" not registered.`);
516
526
  }
517
527
  }
528
+ else if (code === Protocol.Protocol.ROOM_DATA_BYTES) {
529
+ const messageType = (schema.decode.stringCheck(bytes, it))
530
+ ? schema.decode.string(bytes, it)
531
+ : schema.decode.number(bytes, it);
532
+ const message = bytes.slice(it.offset, bytes.length);
533
+ Debug.debugMessage("received: '%s' -> %j", messageType, message);
534
+ if (this.onMessageHandlers[messageType]) {
535
+ this.onMessageHandlers[messageType](client, message);
536
+ }
537
+ else if (this.onMessageHandlers['*']) {
538
+ this.onMessageHandlers['*'](client, messageType, message);
539
+ }
540
+ else {
541
+ Debug.debugAndPrintError(`onMessage for "${messageType}" not registered.`);
542
+ }
543
+ }
518
544
  else if (code === Protocol.Protocol.JOIN_ROOM) {
519
545
  // join room has been acknowledged by the client
520
546
  client.state = Transport.ClientState.JOINED;
package/build/Room.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Room.js","sources":["../src/Room.ts"],"sourcesContent":["import http from 'http';\nimport msgpack from 'notepack.io';\n\nimport { decode, Iterator, Schema } from '@colyseus/schema';\n\nimport Clock from '@gamestdio/timer';\nimport { EventEmitter } from 'events';\nimport { logger } from './Logger';\n\nimport { Presence } from './presence/Presence';\n\nimport { NoneSerializer } from './serializer/NoneSerializer';\nimport { SchemaSerializer } from './serializer/SchemaSerializer';\nimport { Serializer } from './serializer/Serializer';\n\nimport { ErrorCode, getMessageBytes, Protocol } from './Protocol';\nimport { Deferred, HybridArray, generateId } from './Utils';\n\nimport { debugAndPrintError, debugMessage } from './Debug';\nimport { ServerError } from './errors/ServerError';\nimport { RoomListingData } from './matchmaker/driver';\nimport { Client, ClientState, ISendOptions } from './Transport';\n\nconst DEFAULT_PATCH_RATE = 1000 / 20; // 20fps (50ms)\nconst DEFAULT_SIMULATION_INTERVAL = 1000 / 60; // 60fps (16.66ms)\nconst noneSerializer = new NoneSerializer();\n\nexport const DEFAULT_SEAT_RESERVATION_TIME = Number(process.env.COLYSEUS_SEAT_RESERVATION_TIME || 15);\n\nexport type SimulationCallback = (deltaTime: number) => void;\n\nexport type RoomConstructor<T= any> = new (presence?: Presence) => Room<T>;\n\nexport interface IBroadcastOptions extends ISendOptions {\n except?: Client;\n}\n\nexport enum RoomInternalState {\n CREATING = 0,\n CREATED = 1,\n DISCONNECTING = 2,\n}\n\nexport abstract class Room<State= any, Metadata= any> {\n\n public get locked() {\n return this._locked;\n }\n\n public get metadata() {\n return this.listing.metadata;\n }\n\n public listing: RoomListingData<Metadata>;\n public clock: Clock = new Clock();\n\n #_roomId: string;\n #_roomName: string;\n\n public maxClients: number = Infinity;\n public patchRate: number = DEFAULT_PATCH_RATE;\n public autoDispose: boolean = true;\n\n public state: State;\n public presence: Presence;\n\n public clients: HybridArray<Client> = new HybridArray<Client>(\"sessionId\");\n public internalState: RoomInternalState = RoomInternalState.CREATING;\n\n /** @internal */\n public _events = new EventEmitter();\n\n // seat reservation & reconnection\n protected seatReservationTime: number = DEFAULT_SEAT_RESERVATION_TIME;\n protected reservedSeats: { [sessionId: string]: any } = {};\n protected reservedSeatTimeouts: { [sessionId: string]: NodeJS.Timer } = {};\n\n protected _reconnections: { [reconnectionToken: string]: [string, Deferred] } = {};\n private _reconnectingSessionId = new Map<string, string>();\n\n private onMessageHandlers: {[id: string]: (client: Client, message: any) => void} = {};\n\n private _serializer: Serializer<State> = noneSerializer;\n private _afterNextPatchQueue: Array<[string | Client, IArguments]> = [];\n\n private _simulationInterval: NodeJS.Timer;\n private _patchInterval: NodeJS.Timer;\n\n private _locked: boolean = false;\n private _lockedExplicitly: boolean = false;\n private _maxClientsReached: boolean = false;\n\n // this timeout prevents rooms that are created by one process, but no client\n // ever had success joining into it on the specified interval.\n private _autoDisposeTimeout: NodeJS.Timer;\n\n constructor(presence?: Presence) {\n this.presence = presence;\n\n this._events.once('dispose', async () => {\n try {\n await this._dispose();\n\n } catch (e) {\n debugAndPrintError(`onDispose error: ${(e && e.message || e || 'promise rejected')}`);\n }\n this._events.emit('disconnect');\n });\n\n this.setPatchRate(this.patchRate);\n // set default _autoDisposeTimeout\n this.resetAutoDisposeTimeout(this.seatReservationTime);\n }\n\n public get roomName() { return this.#_roomName; }\n public set roomName(roomName: string) {\n if (this.#_roomName) {\n // prevent user from setting roomName after it has been defined.\n throw new ServerError(ErrorCode.APPLICATION_ERROR, \"'roomName' cannot be overwritten.\");\n }\n this.#_roomName = roomName;\n }\n\n public get roomId() { return this.#_roomId; }\n public set roomId(roomId: string) {\n if (this.internalState !== RoomInternalState.CREATING) {\n // prevent user from setting roomId after room has been created.\n throw new ServerError(ErrorCode.APPLICATION_ERROR, \"'roomId' can only be overriden upon room creation.\");\n }\n this.#_roomId = roomId;\n }\n\n // Optional abstract methods\n public onBeforePatch?(state: State): void | Promise<any>;\n public onCreate?(options: any): void | Promise<any>;\n public onJoin?(client: Client, options?: any, auth?: any): void | Promise<any>;\n public onLeave?(client: Client, consented?: boolean): void | Promise<any>;\n public onDispose?(): void | Promise<any>;\n public onAuth(client: Client, options: any, request?: http.IncomingMessage): any | Promise<any> {\n return true;\n }\n\n public hasReachedMaxClients(): boolean {\n return (this.clients.length + Object.keys(this.reservedSeats).length) >= this.maxClients;\n }\n\n public setSeatReservationTime(seconds: number) {\n this.seatReservationTime = seconds;\n return this;\n }\n\n public hasReservedSeat(sessionId: string, reconnectionToken?: string): boolean {\n if (reconnectionToken) {\n const reconnection = this._reconnections[reconnectionToken];\n return (\n reconnection &&\n reconnection[0] === sessionId &&\n this.reservedSeats[sessionId] !== undefined &&\n this._reconnectingSessionId.has(sessionId)\n );\n\n } else {\n return (\n this.reservedSeats[sessionId] !== undefined &&\n !this._reconnectingSessionId.has(sessionId) // prevent possible \"reconnect\" requests without a reconnection token\n );\n }\n }\n\n public checkReconnectionToken(reconnectionToken: string) {\n const reconnection = this._reconnections[reconnectionToken];\n const sessionId = (reconnection && reconnection[0]);\n\n if (this.hasReservedSeat(sessionId)) {\n this._reconnectingSessionId.set(sessionId, reconnectionToken);\n return sessionId;\n\n } else {\n return undefined;\n }\n }\n\n public setSimulationInterval(onTickCallback?: SimulationCallback, delay: number = DEFAULT_SIMULATION_INTERVAL): void {\n // clear previous interval in case called setSimulationInterval more than once\n if (this._simulationInterval) { clearInterval(this._simulationInterval); }\n\n if (onTickCallback) {\n this._simulationInterval = setInterval(() => {\n this.clock.tick();\n onTickCallback(this.clock.deltaTime);\n }, delay);\n }\n }\n\n public setPatchRate(milliseconds: number): void {\n this.patchRate = milliseconds;\n\n // clear previous interval in case called setPatchRate more than once\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (milliseconds !== null && milliseconds !== 0) {\n this._patchInterval = setInterval(() => this.broadcastPatch(), milliseconds);\n }\n }\n\n public setState(newState: State) {\n this.clock.start();\n\n if ('_definition' in newState) {\n this.setSerializer(new SchemaSerializer());\n }\n\n this._serializer.reset(newState);\n\n this.state = newState;\n }\n\n public setSerializer(serializer: Serializer<State>) {\n this._serializer = serializer;\n }\n\n public async setMetadata(meta: Partial<Metadata>) {\n if (!this.listing.metadata) {\n this.listing.metadata = meta as Metadata;\n\n } else {\n for (const field in meta) {\n if (!meta.hasOwnProperty(field)) { continue; }\n this.listing.metadata[field] = meta[field];\n }\n\n // `MongooseDriver` workaround: persit metadata mutations\n if ('markModified' in this.listing) {\n (this.listing as any).markModified('metadata');\n }\n }\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async setPrivate(bool: boolean = true) {\n this.listing.private = bool;\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async lock() {\n // rooms locked internally aren't explicit locks.\n this._lockedExplicitly = (arguments[0] === undefined);\n\n // skip if already locked.\n if (this._locked) { return; }\n\n this._locked = true;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('lock');\n }\n\n public async unlock() {\n // only internal usage passes arguments to this function.\n if (arguments[0] === undefined) {\n this._lockedExplicitly = false;\n }\n\n // skip if already locked\n if (!this._locked) { return; }\n\n this._locked = false;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('unlock');\n }\n\n public send(client: Client, type: string | number, message: any, options?: ISendOptions): void;\n public send(client: Client, message: Schema, options?: ISendOptions): void;\n public send(client: Client, messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions): void {\n logger.warn('DEPRECATION WARNING: use client.send(...) instead of this.send(client, ...)');\n client.send(messageOrType, messageOrOptions, options);\n }\n\n public broadcast(type: string | number, message?: any, options?: IBroadcastOptions);\n public broadcast<T extends Schema>(message: T, options?: IBroadcastOptions);\n public broadcast(\n typeOrSchema: string | number | Schema,\n messageOrOptions?: any | IBroadcastOptions,\n options?: IBroadcastOptions,\n ) {\n const isSchema = (typeof(typeOrSchema) === 'object');\n const opts: IBroadcastOptions = ((isSchema) ? messageOrOptions : options);\n\n if (opts && opts.afterNextPatch) {\n delete opts.afterNextPatch;\n this._afterNextPatchQueue.push(['broadcast', arguments]);\n return;\n }\n\n if (isSchema) {\n this.broadcastMessageSchema(typeOrSchema as Schema, opts);\n\n } else {\n\n this.broadcastMessageType(typeOrSchema as string, messageOrOptions, opts);\n }\n }\n\n public broadcastPatch() {\n if (this.onBeforePatch) {\n this.onBeforePatch(this.state);\n }\n\n if (!this._simulationInterval) {\n this.clock.tick();\n }\n\n if (!this.state) {\n return false;\n }\n\n const hasChanges = this._serializer.applyPatches(this.clients.array, this.state);\n\n // broadcast messages enqueued for \"after patch\"\n this._dequeueAfterPatchMessages();\n\n return hasChanges;\n }\n\n public onMessage<T = any>(messageType: '*', callback: (client: Client, type: string | number, message: T) => void);\n public onMessage<T = any>(messageType: string | number, callback: (client: Client, message: T) => void);\n public onMessage<T = any>(messageType: '*' | string | number, callback: (...args: any[]) => void) {\n this.onMessageHandlers[messageType] = callback;\n // returns a method to unbind the callback\n return () => delete this.onMessageHandlers[messageType];\n }\n\n public async disconnect(): Promise<any> {\n this.internalState = RoomInternalState.DISCONNECTING;\n await this.listing.remove();\n\n this.autoDispose = true;\n\n const delayedDisconnection = new Promise<void>((resolve) =>\n this._events.once('disconnect', () => resolve()));\n\n for (const [_, reconnection] of Object.values(this._reconnections)) {\n reconnection.reject();\n }\n\n let numClients = this.clients.length;\n if (numClients > 0) {\n // clients may have `async onLeave`, room will be disposed after they're fulfilled\n while (numClients--) {\n this._forciblyCloseClient(this.clients.array[numClients], Protocol.WS_CLOSE_CONSENTED);\n }\n } else {\n // no clients connected, dispose immediately.\n this._events.emit('dispose');\n }\n\n return await delayedDisconnection;\n }\n\n public async ['_onJoin'](client: Client, req?: http.IncomingMessage) {\n const sessionId = client.sessionId;\n\n // generate unique private reconnection token\n client._reconnectionToken = generateId();\n\n if (this.reservedSeatTimeouts[sessionId]) {\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n delete this.reservedSeatTimeouts[sessionId];\n }\n\n // clear auto-dispose timeout.\n if (this._autoDisposeTimeout) {\n clearTimeout(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // get seat reservation options and clear it\n const options = this.reservedSeats[sessionId];\n delete this.reservedSeats[sessionId];\n\n // share \"after next patch queue\" reference with every client.\n client._afterNextPatchQueue = this._afterNextPatchQueue;\n\n // bind clean-up callback when client connection closes\n client.ref['onleave'] = this._onLeave.bind(this, client);\n client.ref.once('close', client.ref['onleave']);\n\n this.clients.add(client);\n\n const previousReconnectionToken = this._reconnectingSessionId.get(sessionId);\n if (previousReconnectionToken) {\n this._reconnections[previousReconnectionToken][1].resolve(client);\n\n } else {\n try {\n client.auth = await this.onAuth(client, options, req);\n\n if (!client.auth) {\n throw new ServerError(ErrorCode.AUTH_FAILED, 'onAuth failed');\n }\n\n if (this.onJoin) {\n await this.onJoin(client, options, client.auth);\n }\n } catch (e) {\n this.clients.delete(client);\n\n // make sure an error code is provided.\n if (!e.code) {\n e.code = ErrorCode.APPLICATION_ERROR;\n }\n\n throw e;\n\n } finally {\n // remove seat reservation\n delete this.reservedSeats[sessionId];\n }\n }\n\n // emit 'join' to room handler\n this._events.emit('join', client);\n\n // allow client to send messages after onJoin has succeeded.\n client.ref.on('message', this._onMessage.bind(this, client));\n\n // confirm room id that matches the room name requested to join\n client.raw(getMessageBytes[Protocol.JOIN_ROOM](\n client._reconnectionToken,\n this._serializer.id,\n this._serializer.handshake && this._serializer.handshake(),\n ));\n }\n\n public allowReconnection(previousClient: Client, seconds: number | \"manual\"): Deferred<Client> {\n if (seconds === undefined) { // TODO: remove this check\n console.warn(\"DEPRECATED: allowReconnection() requires a second argument. Using \\\"manual\\\" mode.\");\n seconds = \"manual\";\n }\n\n if (seconds === \"manual\") {\n seconds = Infinity;\n }\n\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n this._disposeIfEmpty(); // gracefully shutting down\n throw new Error('disconnecting');\n }\n\n const sessionId = previousClient.sessionId;\n const reconnectionToken = previousClient._reconnectionToken;\n\n this._reserveSeat(sessionId, true, seconds, true);\n\n // keep reconnection reference in case the user reconnects into this room.\n const reconnection = new Deferred<Client>();\n this._reconnections[reconnectionToken] = [sessionId, reconnection];\n\n if (seconds !== Infinity) {\n // expire seat reservation after timeout\n this.reservedSeatTimeouts[sessionId] = setTimeout(() =>\n reconnection.reject(false), seconds * 1000);\n }\n\n const cleanup = () => {\n delete this._reconnections[reconnectionToken];\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n this._reconnectingSessionId.delete(sessionId);\n };\n\n reconnection.\n then((newClient) => {\n newClient.auth = previousClient.auth;\n previousClient.ref = newClient.ref; // swap \"ref\" for convenience\n previousClient.state = ClientState.RECONNECTED;\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n cleanup();\n }).\n catch(() => {\n cleanup();\n this.resetAutoDisposeTimeout();\n });\n\n return reconnection;\n }\n\n protected resetAutoDisposeTimeout(timeoutInSeconds: number = 1) {\n clearTimeout(this._autoDisposeTimeout);\n\n if (!this.autoDispose) {\n return;\n }\n\n this._autoDisposeTimeout = setTimeout(() => {\n this._autoDisposeTimeout = undefined;\n this._disposeIfEmpty();\n }, timeoutInSeconds * 1000);\n }\n\n private broadcastMessageSchema<T extends Schema>(message: T, options: IBroadcastOptions = {}) {\n debugMessage(\"broadcast: %O\", message);\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA_SCHEMA](message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients.array[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private broadcastMessageType(type: string, message?: any, options: IBroadcastOptions = {}) {\n debugMessage(\"broadcast: %O\", message);\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA](type, message);\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients.array[numClients];\n\n if (options.except !== client) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private sendFullState(client: Client): void {\n client.enqueueRaw(getMessageBytes[Protocol.ROOM_STATE](this._serializer.getFullState(client)));\n }\n\n private _dequeueAfterPatchMessages() {\n const length = this._afterNextPatchQueue.length;\n\n if (length > 0) {\n for (let i = 0; i < length; i++) {\n const [target, args] = this._afterNextPatchQueue[i];\n\n if (target === \"broadcast\") {\n this.broadcast.apply(this, args);\n\n } else {\n (target as Client).raw.apply(target, args);\n }\n }\n\n // new messages may have been added in the meantime,\n // let's splice the ones that have been processed\n this._afterNextPatchQueue.splice(0, length);\n }\n }\n\n private async _reserveSeat(\n sessionId: string,\n joinOptions: any = true,\n seconds: number = this.seatReservationTime,\n allowReconnection: boolean = false,\n ) {\n if (!allowReconnection && this.hasReachedMaxClients()) {\n return false;\n }\n\n this.reservedSeats[sessionId] = joinOptions;\n\n if (!allowReconnection) {\n await this._incrementClientCount();\n\n this.reservedSeatTimeouts[sessionId] = setTimeout(async () => {\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n await this._decrementClientCount();\n }, seconds * 1000);\n\n this.resetAutoDisposeTimeout(seconds);\n }\n\n return true;\n }\n\n private _disposeIfEmpty() {\n const willDispose = (\n this.autoDispose &&\n this._autoDisposeTimeout === undefined &&\n this.clients.length === 0 &&\n Object.keys(this.reservedSeats).length === 0\n );\n\n if (willDispose) {\n this._events.emit('dispose');\n }\n\n return willDispose;\n }\n\n private async _dispose(): Promise<any> {\n let userReturnData;\n\n if (this.onDispose) {\n userReturnData = this.onDispose();\n }\n\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (this._simulationInterval) {\n clearInterval(this._simulationInterval);\n this._simulationInterval = undefined;\n }\n\n if (this._autoDisposeTimeout) {\n clearInterval(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // clear all timeouts/intervals + force to stop ticking\n this.clock.clear();\n this.clock.stop();\n\n return await (userReturnData || Promise.resolve());\n }\n\n private _onMessage(client: Client, bytes: number[]) {\n // skip if client is on LEAVING state.\n if (client.state === ClientState.LEAVING) { return; }\n\n const it: Iterator = { offset: 0 };\n const code = decode.uint8(bytes, it);\n\n if (!bytes) {\n debugAndPrintError(`${this.roomName} (${this.roomId}), couldn't decode message: ${bytes}`);\n return;\n }\n\n if (code === Protocol.ROOM_DATA) {\n const messageType = (decode.stringCheck(bytes, it))\n ? decode.string(bytes, it)\n : decode.number(bytes, it);\n\n let message;\n try {\n message = (bytes.length > it.offset)\n ? msgpack.decode(bytes.slice(it.offset, bytes.length))\n : undefined;\n debugMessage(\"received: '%s' -> %j\", messageType, message);\n\n } catch (e) {\n debugAndPrintError(e);\n return;\n }\n\n if (this.onMessageHandlers[messageType]) {\n this.onMessageHandlers[messageType](client, message);\n\n } else if (this.onMessageHandlers['*']) {\n (this.onMessageHandlers['*'] as any)(client, messageType, message);\n\n } else {\n debugAndPrintError(`onMessage for \"${messageType}\" not registered.`);\n }\n\n } else if (code === Protocol.JOIN_ROOM) {\n // join room has been acknowledged by the client\n client.state = ClientState.JOINED;\n\n // send current state when new client joins the room\n if (this.state) {\n this.sendFullState(client);\n }\n\n // dequeue messages sent before client has joined effectively (on user-defined `onJoin`)\n if (client._enqueuedMessages.length > 0) {\n client._enqueuedMessages.forEach((enqueued) => client.raw(enqueued));\n }\n delete client._enqueuedMessages;\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this._forciblyCloseClient(client, Protocol.WS_CLOSE_CONSENTED);\n }\n\n }\n\n private _forciblyCloseClient(client: Client, closeCode: number) {\n // stop receiving messages from this client\n client.ref.removeAllListeners('message');\n\n // prevent \"onLeave\" from being called twice if player asks to leave\n client.ref.removeListener('close', client.ref['onleave']);\n\n // only effectively close connection when \"onLeave\" is fulfilled\n this._onLeave(client, closeCode).then(() => client.leave(Protocol.WS_CLOSE_NORMAL));\n }\n\n private async _onLeave(client: Client, code?: number): Promise<any> {\n const success = this.clients.delete(client);\n\n // call 'onLeave' method only if the client has been successfully accepted.\n if (success && this.onLeave) {\n try {\n client.state = ClientState.LEAVING;\n await this.onLeave(client, (code === Protocol.WS_CLOSE_CONSENTED));\n\n } catch (e) {\n debugAndPrintError(`onLeave error: ${(e && e.message || e || 'promise rejected')}`);\n }\n }\n\n if (client.state !== ClientState.RECONNECTED) {\n // try to dispose immediatelly if client reconnection isn't set up.\n const willDispose = await this._decrementClientCount();\n\n this._events.emit('leave', client, willDispose);\n }\n }\n\n private async _incrementClientCount() {\n // lock automatically when maxClients is reached\n if (!this._locked && this.hasReachedMaxClients()) {\n this._maxClientsReached = true;\n this.lock.call(this, true);\n }\n\n await this.listing.updateOne({\n $inc: { clients: 1 },\n $set: { locked: this._locked },\n });\n }\n\n private async _decrementClientCount() {\n const willDispose = this._disposeIfEmpty();\n\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n return;\n }\n\n // unlock if room is available for new connections\n if (!willDispose) {\n if (this._maxClientsReached && !this._lockedExplicitly) {\n this._maxClientsReached = false;\n this.unlock.call(this, true);\n }\n\n // update room listing cache\n await this.listing.updateOne({\n $inc: { clients: -1 },\n $set: { locked: this._locked },\n });\n }\n\n return willDispose;\n }\n\n}\n"],"names":["NoneSerializer","RoomInternalState","Clock","HybridArray","EventEmitter","debugAndPrintError","ServerError","ErrorCode","SchemaSerializer","logger","Protocol","generateId","getMessageBytes","Deferred","ClientState","debugMessage","decode","msgpack"],"mappings":"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"}
1
+ {"version":3,"file":"Room.js","sources":["../src/Room.ts"],"sourcesContent":["import http from 'http';\nimport msgpack from 'notepack.io';\n\nimport { decode, Iterator, Schema } from '@colyseus/schema';\n\nimport Clock from '@gamestdio/timer';\nimport { EventEmitter } from 'events';\nimport { logger } from './Logger';\n\nimport { Presence } from './presence/Presence';\n\nimport { NoneSerializer } from './serializer/NoneSerializer';\nimport { SchemaSerializer } from './serializer/SchemaSerializer';\nimport { Serializer } from './serializer/Serializer';\n\nimport { ErrorCode, getMessageBytes, Protocol } from './Protocol';\nimport { Deferred, HybridArray, generateId } from './Utils';\n\nimport { debugAndPrintError, debugMessage } from './Debug';\nimport { ServerError } from './errors/ServerError';\nimport { RoomListingData } from './matchmaker/driver';\nimport { Client, ClientState, ISendOptions } from './Transport';\n\nconst DEFAULT_PATCH_RATE = 1000 / 20; // 20fps (50ms)\nconst DEFAULT_SIMULATION_INTERVAL = 1000 / 60; // 60fps (16.66ms)\nconst noneSerializer = new NoneSerializer();\n\nexport const DEFAULT_SEAT_RESERVATION_TIME = Number(process.env.COLYSEUS_SEAT_RESERVATION_TIME || 15);\n\nexport type SimulationCallback = (deltaTime: number) => void;\n\nexport type RoomConstructor<T= any> = new (presence?: Presence) => Room<T>;\n\nexport interface IBroadcastOptions extends ISendOptions {\n except?: Client | Client[];\n}\n\nexport enum RoomInternalState {\n CREATING = 0,\n CREATED = 1,\n DISCONNECTING = 2,\n}\n\nexport abstract class Room<State= any, Metadata= any> {\n\n public get locked() {\n return this._locked;\n }\n\n public get metadata() {\n return this.listing.metadata;\n }\n\n public listing: RoomListingData<Metadata>;\n public clock: Clock = new Clock();\n\n #_roomId: string;\n #_roomName: string;\n\n public maxClients: number = Infinity;\n public patchRate: number = DEFAULT_PATCH_RATE;\n public autoDispose: boolean = true;\n\n public state: State;\n public presence: Presence;\n\n public clients: HybridArray<Client> = new HybridArray<Client>(\"sessionId\");\n public internalState: RoomInternalState = RoomInternalState.CREATING;\n\n /** @internal */\n public _events = new EventEmitter();\n\n // seat reservation & reconnection\n protected seatReservationTime: number = DEFAULT_SEAT_RESERVATION_TIME;\n protected reservedSeats: { [sessionId: string]: any } = {};\n protected reservedSeatTimeouts: { [sessionId: string]: NodeJS.Timer } = {};\n\n protected _reconnections: { [reconnectionToken: string]: [string, Deferred] } = {};\n private _reconnectingSessionId = new Map<string, string>();\n\n private onMessageHandlers: {[id: string]: (client: Client, message: any) => void} = {};\n\n private _serializer: Serializer<State> = noneSerializer;\n private _afterNextPatchQueue: Array<[string | Client, IArguments]> = [];\n\n private _simulationInterval: NodeJS.Timer;\n private _patchInterval: NodeJS.Timer;\n\n private _locked: boolean = false;\n private _lockedExplicitly: boolean = false;\n private _maxClientsReached: boolean = false;\n\n // this timeout prevents rooms that are created by one process, but no client\n // ever had success joining into it on the specified interval.\n private _autoDisposeTimeout: NodeJS.Timer;\n\n constructor(presence?: Presence) {\n this.presence = presence;\n\n this._events.once('dispose', async () => {\n try {\n await this._dispose();\n\n } catch (e) {\n debugAndPrintError(`onDispose error: ${(e && e.message || e || 'promise rejected')}`);\n }\n this._events.emit('disconnect');\n });\n\n this.setPatchRate(this.patchRate);\n // set default _autoDisposeTimeout\n this.resetAutoDisposeTimeout(this.seatReservationTime);\n }\n\n public get roomName() { return this.#_roomName; }\n public set roomName(roomName: string) {\n if (this.#_roomName) {\n // prevent user from setting roomName after it has been defined.\n throw new ServerError(ErrorCode.APPLICATION_ERROR, \"'roomName' cannot be overwritten.\");\n }\n this.#_roomName = roomName;\n }\n\n public get roomId() { return this.#_roomId; }\n public set roomId(roomId: string) {\n if (this.internalState !== RoomInternalState.CREATING) {\n // prevent user from setting roomId after room has been created.\n throw new ServerError(ErrorCode.APPLICATION_ERROR, \"'roomId' can only be overriden upon room creation.\");\n }\n this.#_roomId = roomId;\n }\n\n // Optional abstract methods\n public onBeforePatch?(state: State): void | Promise<any>;\n public onCreate?(options: any): void | Promise<any>;\n public onJoin?(client: Client, options?: any, auth?: any): void | Promise<any>;\n public onLeave?(client: Client, consented?: boolean): void | Promise<any>;\n public onDispose?(): void | Promise<any>;\n public onAuth(client: Client, options: any, request?: http.IncomingMessage): any | Promise<any> {\n return true;\n }\n\n public hasReachedMaxClients(): boolean {\n return (this.clients.length + Object.keys(this.reservedSeats).length) >= this.maxClients;\n }\n\n public setSeatReservationTime(seconds: number) {\n this.seatReservationTime = seconds;\n return this;\n }\n\n public hasReservedSeat(sessionId: string, reconnectionToken?: string): boolean {\n if (reconnectionToken) {\n const reconnection = this._reconnections[reconnectionToken];\n return (\n reconnection &&\n reconnection[0] === sessionId &&\n this.reservedSeats[sessionId] !== undefined &&\n this._reconnectingSessionId.has(sessionId)\n );\n\n } else {\n return (\n this.reservedSeats[sessionId] !== undefined &&\n !this._reconnectingSessionId.has(sessionId) // prevent possible \"reconnect\" requests without a reconnection token\n );\n }\n }\n\n public checkReconnectionToken(reconnectionToken: string) {\n const reconnection = this._reconnections[reconnectionToken];\n const sessionId = (reconnection && reconnection[0]);\n\n if (this.hasReservedSeat(sessionId)) {\n this._reconnectingSessionId.set(sessionId, reconnectionToken);\n return sessionId;\n\n } else {\n return undefined;\n }\n }\n\n public setSimulationInterval(onTickCallback?: SimulationCallback, delay: number = DEFAULT_SIMULATION_INTERVAL): void {\n // clear previous interval in case called setSimulationInterval more than once\n if (this._simulationInterval) { clearInterval(this._simulationInterval); }\n\n if (onTickCallback) {\n this._simulationInterval = setInterval(() => {\n this.clock.tick();\n onTickCallback(this.clock.deltaTime);\n }, delay);\n }\n }\n\n public setPatchRate(milliseconds: number): void {\n this.patchRate = milliseconds;\n\n // clear previous interval in case called setPatchRate more than once\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (milliseconds !== null && milliseconds !== 0) {\n this._patchInterval = setInterval(() => this.broadcastPatch(), milliseconds);\n }\n }\n\n public setState(newState: State) {\n this.clock.start();\n\n if ('_definition' in newState) {\n this.setSerializer(new SchemaSerializer());\n }\n\n this._serializer.reset(newState);\n\n this.state = newState;\n }\n\n public setSerializer(serializer: Serializer<State>) {\n this._serializer = serializer;\n }\n\n public async setMetadata(meta: Partial<Metadata>) {\n if (!this.listing.metadata) {\n this.listing.metadata = meta as Metadata;\n\n } else {\n for (const field in meta) {\n if (!meta.hasOwnProperty(field)) { continue; }\n this.listing.metadata[field] = meta[field];\n }\n\n // `MongooseDriver` workaround: persit metadata mutations\n if ('markModified' in this.listing) {\n (this.listing as any).markModified('metadata');\n }\n }\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async setPrivate(bool: boolean = true) {\n this.listing.private = bool;\n\n if (this.internalState === RoomInternalState.CREATED) {\n await this.listing.save();\n }\n }\n\n public async lock() {\n // rooms locked internally aren't explicit locks.\n this._lockedExplicitly = (arguments[0] === undefined);\n\n // skip if already locked.\n if (this._locked) { return; }\n\n this._locked = true;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('lock');\n }\n\n public async unlock() {\n // only internal usage passes arguments to this function.\n if (arguments[0] === undefined) {\n this._lockedExplicitly = false;\n }\n\n // skip if already locked\n if (!this._locked) { return; }\n\n this._locked = false;\n\n await this.listing.updateOne({\n $set: { locked: this._locked },\n });\n\n this._events.emit('unlock');\n }\n\n public send(client: Client, type: string | number, message: any, options?: ISendOptions): void;\n public send(client: Client, message: Schema, options?: ISendOptions): void;\n public send(client: Client, messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions): void {\n logger.warn('DEPRECATION WARNING: use client.send(...) instead of this.send(client, ...)');\n client.send(messageOrType, messageOrOptions, options);\n }\n\n public broadcast(type: string | number, message?: any, options?: IBroadcastOptions);\n public broadcast<T extends Schema>(message: T, options?: IBroadcastOptions);\n public broadcast(\n typeOrSchema: string | number | Schema,\n messageOrOptions?: any | IBroadcastOptions,\n options?: IBroadcastOptions,\n ) {\n const isSchema = (typeof(typeOrSchema) === 'object');\n const opts: IBroadcastOptions = ((isSchema) ? messageOrOptions : options);\n\n if (opts && opts.afterNextPatch) {\n delete opts.afterNextPatch;\n this._afterNextPatchQueue.push(['broadcast', arguments]);\n return;\n }\n\n if (isSchema) {\n this.broadcastMessageSchema(typeOrSchema as Schema, opts);\n\n } else {\n\n this.broadcastMessageType(typeOrSchema as string, messageOrOptions, opts);\n }\n }\n\n public broadcastPatch() {\n if (this.onBeforePatch) {\n this.onBeforePatch(this.state);\n }\n\n if (!this._simulationInterval) {\n this.clock.tick();\n }\n\n if (!this.state) {\n return false;\n }\n\n const hasChanges = this._serializer.applyPatches(this.clients.array, this.state);\n\n // broadcast messages enqueued for \"after patch\"\n this._dequeueAfterPatchMessages();\n\n return hasChanges;\n }\n\n public onMessage<T = any>(messageType: '*', callback: (client: Client, type: string | number, message: T) => void);\n public onMessage<T = any>(messageType: string | number, callback: (client: Client, message: T) => void);\n public onMessage<T = any>(messageType: '*' | string | number, callback: (...args: any[]) => void) {\n this.onMessageHandlers[messageType] = callback;\n // returns a method to unbind the callback\n return () => delete this.onMessageHandlers[messageType];\n }\n\n public async disconnect(): Promise<any> {\n this.internalState = RoomInternalState.DISCONNECTING;\n await this.listing.remove();\n\n this.autoDispose = true;\n\n const delayedDisconnection = new Promise<void>((resolve) =>\n this._events.once('disconnect', () => resolve()));\n\n for (const [_, reconnection] of Object.values(this._reconnections)) {\n reconnection.reject();\n }\n\n let numClients = this.clients.length;\n if (numClients > 0) {\n // clients may have `async onLeave`, room will be disposed after they're fulfilled\n while (numClients--) {\n this._forciblyCloseClient(this.clients.array[numClients], Protocol.WS_CLOSE_CONSENTED);\n }\n } else {\n // no clients connected, dispose immediately.\n this._events.emit('dispose');\n }\n\n return await delayedDisconnection;\n }\n\n public async ['_onJoin'](client: Client, req?: http.IncomingMessage) {\n const sessionId = client.sessionId;\n\n // generate unique private reconnection token\n client._reconnectionToken = generateId();\n\n if (this.reservedSeatTimeouts[sessionId]) {\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n delete this.reservedSeatTimeouts[sessionId];\n }\n\n // clear auto-dispose timeout.\n if (this._autoDisposeTimeout) {\n clearTimeout(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // get seat reservation options and clear it\n const options = this.reservedSeats[sessionId];\n delete this.reservedSeats[sessionId];\n\n // share \"after next patch queue\" reference with every client.\n client._afterNextPatchQueue = this._afterNextPatchQueue;\n\n // bind clean-up callback when client connection closes\n client.ref['onleave'] = this._onLeave.bind(this, client);\n client.ref.once('close', client.ref['onleave']);\n\n this.clients.add(client);\n\n const previousReconnectionToken = this._reconnectingSessionId.get(sessionId);\n if (previousReconnectionToken) {\n this._reconnections[previousReconnectionToken][1].resolve(client);\n\n } else {\n try {\n client.auth = await this.onAuth(client, options, req);\n\n if (!client.auth) {\n throw new ServerError(ErrorCode.AUTH_FAILED, 'onAuth failed');\n }\n\n if (this.onJoin) {\n await this.onJoin(client, options, client.auth);\n }\n } catch (e) {\n this.clients.delete(client);\n\n // make sure an error code is provided.\n if (!e.code) {\n e.code = ErrorCode.APPLICATION_ERROR;\n }\n\n throw e;\n\n } finally {\n // remove seat reservation\n delete this.reservedSeats[sessionId];\n }\n }\n\n // emit 'join' to room handler\n this._events.emit('join', client);\n\n // allow client to send messages after onJoin has succeeded.\n client.ref.on('message', this._onMessage.bind(this, client));\n\n // confirm room id that matches the room name requested to join\n client.raw(getMessageBytes[Protocol.JOIN_ROOM](\n client._reconnectionToken,\n this._serializer.id,\n this._serializer.handshake && this._serializer.handshake(),\n ));\n }\n\n public allowReconnection(previousClient: Client, seconds: number | \"manual\"): Deferred<Client> {\n if (seconds === undefined) { // TODO: remove this check\n console.warn(\"DEPRECATED: allowReconnection() requires a second argument. Using \\\"manual\\\" mode.\");\n seconds = \"manual\";\n }\n\n if (seconds === \"manual\") {\n seconds = Infinity;\n }\n\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n this._disposeIfEmpty(); // gracefully shutting down\n throw new Error('disconnecting');\n }\n\n const sessionId = previousClient.sessionId;\n const reconnectionToken = previousClient._reconnectionToken;\n\n this._reserveSeat(sessionId, true, seconds, true);\n\n // keep reconnection reference in case the user reconnects into this room.\n const reconnection = new Deferred<Client>();\n this._reconnections[reconnectionToken] = [sessionId, reconnection];\n\n if (seconds !== Infinity) {\n // expire seat reservation after timeout\n this.reservedSeatTimeouts[sessionId] = setTimeout(() =>\n reconnection.reject(false), seconds * 1000);\n }\n\n const cleanup = () => {\n delete this._reconnections[reconnectionToken];\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n this._reconnectingSessionId.delete(sessionId);\n };\n\n reconnection.\n then((newClient) => {\n newClient.auth = previousClient.auth;\n previousClient.ref = newClient.ref; // swap \"ref\" for convenience\n previousClient.state = ClientState.RECONNECTED;\n clearTimeout(this.reservedSeatTimeouts[sessionId]);\n cleanup();\n }).\n catch(() => {\n cleanup();\n this.resetAutoDisposeTimeout();\n });\n\n return reconnection;\n }\n\n protected resetAutoDisposeTimeout(timeoutInSeconds: number = 1) {\n clearTimeout(this._autoDisposeTimeout);\n\n if (!this.autoDispose) {\n return;\n }\n\n this._autoDisposeTimeout = setTimeout(() => {\n this._autoDisposeTimeout = undefined;\n this._disposeIfEmpty();\n }, timeoutInSeconds * 1000);\n }\n\n private broadcastMessageSchema<T extends Schema>(message: T, options: IBroadcastOptions = {}) {\n debugMessage(\"broadcast: %O\", message);\n const encodedMessage = getMessageBytes[Protocol.ROOM_DATA_SCHEMA](message);\n const except = (typeof (options.except) !== \"undefined\")\n ? Array.isArray(options.except)\n ? options.except\n : [options.except]\n : undefined;\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients.array[numClients];\n\n if (!except || !except.includes(client)) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private broadcastMessageType(type: string, message?: any, options: IBroadcastOptions = {}) {\n debugMessage(\"broadcast: %O\", message);\n const encodedMessage = getMessageBytes.raw(Protocol.ROOM_DATA, type, message);\n const except = (typeof (options.except) !== \"undefined\")\n ? Array.isArray(options.except)\n ? options.except\n : [options.except]\n : undefined;\n\n let numClients = this.clients.length;\n while (numClients--) {\n const client = this.clients.array[numClients];\n\n if (!except || !except.includes(client)) {\n client.enqueueRaw(encodedMessage);\n }\n }\n }\n\n private sendFullState(client: Client): void {\n client.enqueueRaw(getMessageBytes[Protocol.ROOM_STATE](this._serializer.getFullState(client)));\n }\n\n private _dequeueAfterPatchMessages() {\n const length = this._afterNextPatchQueue.length;\n\n if (length > 0) {\n for (let i = 0; i < length; i++) {\n const [target, args] = this._afterNextPatchQueue[i];\n\n if (target === \"broadcast\") {\n this.broadcast.apply(this, args);\n\n } else {\n (target as Client).raw.apply(target, args);\n }\n }\n\n // new messages may have been added in the meantime,\n // let's splice the ones that have been processed\n this._afterNextPatchQueue.splice(0, length);\n }\n }\n\n private async _reserveSeat(\n sessionId: string,\n joinOptions: any = true,\n seconds: number = this.seatReservationTime,\n allowReconnection: boolean = false,\n ) {\n if (!allowReconnection && this.hasReachedMaxClients()) {\n return false;\n }\n\n this.reservedSeats[sessionId] = joinOptions;\n\n if (!allowReconnection) {\n await this._incrementClientCount();\n\n this.reservedSeatTimeouts[sessionId] = setTimeout(async () => {\n delete this.reservedSeats[sessionId];\n delete this.reservedSeatTimeouts[sessionId];\n await this._decrementClientCount();\n }, seconds * 1000);\n\n this.resetAutoDisposeTimeout(seconds);\n }\n\n return true;\n }\n\n private _disposeIfEmpty() {\n const willDispose = (\n this.autoDispose &&\n this._autoDisposeTimeout === undefined &&\n this.clients.length === 0 &&\n Object.keys(this.reservedSeats).length === 0\n );\n\n if (willDispose) {\n this._events.emit('dispose');\n }\n\n return willDispose;\n }\n\n private async _dispose(): Promise<any> {\n let userReturnData;\n\n if (this.onDispose) {\n userReturnData = this.onDispose();\n }\n\n if (this._patchInterval) {\n clearInterval(this._patchInterval);\n this._patchInterval = undefined;\n }\n\n if (this._simulationInterval) {\n clearInterval(this._simulationInterval);\n this._simulationInterval = undefined;\n }\n\n if (this._autoDisposeTimeout) {\n clearInterval(this._autoDisposeTimeout);\n this._autoDisposeTimeout = undefined;\n }\n\n // clear all timeouts/intervals + force to stop ticking\n this.clock.clear();\n this.clock.stop();\n\n return await (userReturnData || Promise.resolve());\n }\n\n private _onMessage(client: Client, bytes: number[]) {\n // skip if client is on LEAVING state.\n if (client.state === ClientState.LEAVING) { return; }\n\n const it: Iterator = { offset: 0 };\n const code = decode.uint8(bytes, it);\n\n if (!bytes) {\n debugAndPrintError(`${this.roomName} (${this.roomId}), couldn't decode message: ${bytes}`);\n return;\n }\n\n if (code === Protocol.ROOM_DATA) {\n const messageType = (decode.stringCheck(bytes, it))\n ? decode.string(bytes, it)\n : decode.number(bytes, it);\n\n let message;\n try {\n message = (bytes.length > it.offset)\n ? msgpack.decode(bytes.slice(it.offset, bytes.length))\n : undefined;\n debugMessage(\"received: '%s' -> %j\", messageType, message);\n } catch (e) {\n debugAndPrintError(e);\n return;\n }\n\n if (this.onMessageHandlers[messageType]) {\n this.onMessageHandlers[messageType](client, message);\n\n } else if (this.onMessageHandlers['*']) {\n (this.onMessageHandlers['*'] as any)(client, messageType, message);\n\n } else {\n debugAndPrintError(`onMessage for \"${messageType}\" not registered.`);\n }\n\n } else if (code === Protocol.ROOM_DATA_BYTES) {\n const messageType = (decode.stringCheck(bytes, it))\n ? decode.string(bytes, it)\n : decode.number(bytes, it);\n\n const message = bytes.slice(it.offset, bytes.length);\n debugMessage(\"received: '%s' -> %j\", messageType, message);\n\n if (this.onMessageHandlers[messageType]) {\n this.onMessageHandlers[messageType](client, message);\n\n } else if (this.onMessageHandlers['*']) {\n (this.onMessageHandlers['*'] as any)(client, messageType, message);\n\n } else {\n debugAndPrintError(`onMessage for \"${messageType}\" not registered.`);\n }\n\n } else if (code === Protocol.JOIN_ROOM) {\n // join room has been acknowledged by the client\n client.state = ClientState.JOINED;\n\n // send current state when new client joins the room\n if (this.state) {\n this.sendFullState(client);\n }\n\n // dequeue messages sent before client has joined effectively (on user-defined `onJoin`)\n if (client._enqueuedMessages.length > 0) {\n client._enqueuedMessages.forEach((enqueued) => client.raw(enqueued));\n }\n delete client._enqueuedMessages;\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this._forciblyCloseClient(client, Protocol.WS_CLOSE_CONSENTED);\n }\n\n }\n\n private _forciblyCloseClient(client: Client, closeCode: number) {\n // stop receiving messages from this client\n client.ref.removeAllListeners('message');\n\n // prevent \"onLeave\" from being called twice if player asks to leave\n client.ref.removeListener('close', client.ref['onleave']);\n\n // only effectively close connection when \"onLeave\" is fulfilled\n this._onLeave(client, closeCode).then(() => client.leave(Protocol.WS_CLOSE_NORMAL));\n }\n\n private async _onLeave(client: Client, code?: number): Promise<any> {\n const success = this.clients.delete(client);\n\n // call 'onLeave' method only if the client has been successfully accepted.\n if (success && this.onLeave) {\n try {\n client.state = ClientState.LEAVING;\n await this.onLeave(client, (code === Protocol.WS_CLOSE_CONSENTED));\n\n } catch (e) {\n debugAndPrintError(`onLeave error: ${(e && e.message || e || 'promise rejected')}`);\n }\n }\n\n if (client.state !== ClientState.RECONNECTED) {\n // try to dispose immediatelly if client reconnection isn't set up.\n const willDispose = await this._decrementClientCount();\n\n this._events.emit('leave', client, willDispose);\n }\n }\n\n private async _incrementClientCount() {\n // lock automatically when maxClients is reached\n if (!this._locked && this.hasReachedMaxClients()) {\n this._maxClientsReached = true;\n this.lock.call(this, true);\n }\n\n await this.listing.updateOne({\n $inc: { clients: 1 },\n $set: { locked: this._locked },\n });\n }\n\n private async _decrementClientCount() {\n const willDispose = this._disposeIfEmpty();\n\n if (this.internalState === RoomInternalState.DISCONNECTING) {\n return;\n }\n\n // unlock if room is available for new connections\n if (!willDispose) {\n if (this._maxClientsReached && !this._lockedExplicitly) {\n this._maxClientsReached = false;\n this.unlock.call(this, true);\n }\n\n // update room listing cache\n await this.listing.updateOne({\n $inc: { clients: -1 },\n $set: { locked: this._locked },\n });\n }\n\n return willDispose;\n }\n\n}\n"],"names":["NoneSerializer","RoomInternalState","Clock","HybridArray","EventEmitter","debugAndPrintError","ServerError","ErrorCode","SchemaSerializer","logger","Protocol","generateId","getMessageBytes","Deferred","ClientState","debugMessage","decode","msgpack"],"mappings":"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"}
package/build/Room.mjs CHANGED
@@ -383,21 +383,31 @@ class Room {
383
383
  broadcastMessageSchema(message, options = {}) {
384
384
  debugMessage("broadcast: %O", message);
385
385
  const encodedMessage = getMessageBytes[Protocol.ROOM_DATA_SCHEMA](message);
386
+ const except = (typeof (options.except) !== "undefined")
387
+ ? Array.isArray(options.except)
388
+ ? options.except
389
+ : [options.except]
390
+ : undefined;
386
391
  let numClients = this.clients.length;
387
392
  while (numClients--) {
388
393
  const client = this.clients.array[numClients];
389
- if (options.except !== client) {
394
+ if (!except || !except.includes(client)) {
390
395
  client.enqueueRaw(encodedMessage);
391
396
  }
392
397
  }
393
398
  }
394
399
  broadcastMessageType(type, message, options = {}) {
395
400
  debugMessage("broadcast: %O", message);
396
- const encodedMessage = getMessageBytes[Protocol.ROOM_DATA](type, message);
401
+ const encodedMessage = getMessageBytes.raw(Protocol.ROOM_DATA, type, message);
402
+ const except = (typeof (options.except) !== "undefined")
403
+ ? Array.isArray(options.except)
404
+ ? options.except
405
+ : [options.except]
406
+ : undefined;
397
407
  let numClients = this.clients.length;
398
408
  while (numClients--) {
399
409
  const client = this.clients.array[numClients];
400
- if (options.except !== client) {
410
+ if (!except || !except.includes(client)) {
401
411
  client.enqueueRaw(encodedMessage);
402
412
  }
403
413
  }
@@ -506,6 +516,22 @@ class Room {
506
516
  debugAndPrintError(`onMessage for "${messageType}" not registered.`);
507
517
  }
508
518
  }
519
+ else if (code === Protocol.ROOM_DATA_BYTES) {
520
+ const messageType = (decode.stringCheck(bytes, it))
521
+ ? decode.string(bytes, it)
522
+ : decode.number(bytes, it);
523
+ const message = bytes.slice(it.offset, bytes.length);
524
+ debugMessage("received: '%s' -> %j", messageType, message);
525
+ if (this.onMessageHandlers[messageType]) {
526
+ this.onMessageHandlers[messageType](client, message);
527
+ }
528
+ else if (this.onMessageHandlers['*']) {
529
+ this.onMessageHandlers['*'](client, messageType, message);
530
+ }
531
+ else {
532
+ debugAndPrintError(`onMessage for "${messageType}" not registered.`);
533
+ }
534
+ }
509
535
  else if (code === Protocol.JOIN_ROOM) {
510
536
  // join room has been acknowledged by the client
511
537
  client.state = ClientState.JOINED;