@colyseus/core 0.15.41 → 0.16.0-preview.1

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.
Files changed (46) hide show
  1. package/README.md +5 -5
  2. package/build/IPC.js.map +1 -1
  3. package/build/IPC.mjs.map +1 -1
  4. package/build/MatchMaker.d.ts +1 -2
  5. package/build/MatchMaker.js +3 -13
  6. package/build/MatchMaker.js.map +2 -2
  7. package/build/MatchMaker.mjs +3 -12
  8. package/build/MatchMaker.mjs.map +2 -2
  9. package/build/Protocol.d.ts +5 -8
  10. package/build/Protocol.js +36 -79
  11. package/build/Protocol.js.map +2 -2
  12. package/build/Protocol.mjs +37 -79
  13. package/build/Protocol.mjs.map +2 -2
  14. package/build/Room.d.ts +13 -16
  15. package/build/Room.js +7 -23
  16. package/build/Room.js.map +3 -3
  17. package/build/Room.mjs +8 -24
  18. package/build/Room.mjs.map +2 -2
  19. package/build/Transport.d.ts +13 -6
  20. package/build/Transport.js.map +2 -2
  21. package/build/Transport.mjs.map +2 -2
  22. package/build/index.d.ts +1 -1
  23. package/build/index.js +2 -2
  24. package/build/index.js.map +2 -2
  25. package/build/index.mjs +2 -2
  26. package/build/index.mjs.map +2 -2
  27. package/build/presence/LocalPresence.d.ts +1 -1
  28. package/build/presence/LocalPresence.js.map +2 -2
  29. package/build/presence/LocalPresence.mjs.map +2 -2
  30. package/build/rooms/RelayRoom.js +2 -3
  31. package/build/rooms/RelayRoom.js.map +2 -2
  32. package/build/rooms/RelayRoom.mjs +3 -4
  33. package/build/rooms/RelayRoom.mjs.map +2 -2
  34. package/build/serializer/SchemaSerializer.d.ts +9 -6
  35. package/build/serializer/SchemaSerializer.js +59 -43
  36. package/build/serializer/SchemaSerializer.js.map +2 -2
  37. package/build/serializer/SchemaSerializer.mjs +60 -44
  38. package/build/serializer/SchemaSerializer.mjs.map +2 -2
  39. package/build/serializer/Serializer.d.ts +3 -2
  40. package/build/serializer/Serializer.js.map +1 -1
  41. package/build/utils/Utils.d.ts +1 -8
  42. package/build/utils/Utils.js +3 -3
  43. package/build/utils/Utils.js.map +2 -2
  44. package/build/utils/Utils.mjs +2 -2
  45. package/build/utils/Utils.mjs.map +2 -2
  46. package/package.json +4 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/rooms/RelayRoom.ts"],
4
- "sourcesContent": ["import { Context, defineTypes, MapSchema, Schema } from '@colyseus/schema';\n\nimport { Room } from '../Room';\nimport { Client } from '../Transport';\n\n/**\n * Create another context to avoid these types from being in the user's global `Context`\n */\nconst context = new Context();\n\nclass Player extends Schema { // tslint:disable-line\n public connected: boolean;\n public name: string;\n public sessionId: string;\n}\ndefineTypes(Player, {\n connected: 'boolean',\n name: 'string',\n sessionId: 'string',\n}, { context });\n\nclass State extends Schema { // tslint:disable-line\n public players = new MapSchema<Player>();\n}\ndefineTypes(State, {\n players: { map: Player },\n}, { context });\n\n/**\n * client.joinOrCreate(\"relayroom\", {\n * maxClients: 10,\n * allowReconnectionTime: 20\n * });\n */\n\nexport class RelayRoom extends Room<State> { // tslint:disable-line\n public allowReconnectionTime: number = 0;\n\n public onCreate(options: Partial<{\n maxClients: number,\n allowReconnectionTime: number,\n metadata: any,\n }>) {\n this.setState(new State());\n\n if (options.maxClients) {\n this.maxClients = options.maxClients;\n }\n\n if (options.allowReconnectionTime) {\n this.allowReconnectionTime = Math.min(options.allowReconnectionTime, 40);\n }\n\n if (options.metadata) {\n this.setMetadata(options.metadata);\n }\n\n this.onMessage('*', (client: Client, type: string, message: any) => {\n this.broadcast(type, [client.sessionId, message], { except: client });\n });\n }\n\n public onJoin(client: Client, options: any = {}) {\n const player = new Player();\n\n player.connected = true;\n player.sessionId = client.sessionId;\n\n if (options.name) {\n player.name = options.name;\n }\n\n this.state.players.set(client.sessionId, player);\n }\n\n public async onLeave(client: Client, consented: boolean) {\n if (this.allowReconnectionTime > 0) {\n const player = this.state.players.get(client.sessionId);\n player.connected = false;\n\n try {\n if (consented) {\n throw new Error('consented leave');\n }\n\n await this.allowReconnection(client, this.allowReconnectionTime);\n player.connected = true;\n\n } catch (e) {\n this.state.players.delete(client.sessionId);\n }\n }\n }\n\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAwD;AAExD,kBAAqB;AAMrB,MAAM,UAAU,IAAI,sBAAQ;AAE5B,MAAM,eAAe,qBAAO;AAI5B;AAAA,IACA,2BAAY,QAAQ;AAAA,EAClB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AACb,GAAG,EAAE,QAAQ,CAAC;AAEd,MAAM,cAAc,qBAAO;AAAA,EAA3B;AAAA;AACE,SAAO,UAAU,IAAI,wBAAkB;AAAA;AACzC;AAAA,IACA,2BAAY,OAAO;AAAA,EACjB,SAAS,EAAE,KAAK,OAAO;AACzB,GAAG,EAAE,QAAQ,CAAC;AASP,MAAM,kBAAkB,iBAAY;AAAA,EAApC;AAAA;AACL,SAAO,wBAAgC;AAAA;AAAA,EAEhC,SAAS,SAIZ;AACF,SAAK,SAAS,IAAI,MAAM,CAAC;AAEzB,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAEA,QAAI,QAAQ,uBAAuB;AACjC,WAAK,wBAAwB,KAAK,IAAI,QAAQ,uBAAuB,EAAE;AAAA,IACzE;AAEA,QAAI,QAAQ,UAAU;AACpB,WAAK,YAAY,QAAQ,QAAQ;AAAA,IACnC;AAEA,SAAK,UAAU,KAAK,CAAC,QAAgB,MAAc,YAAiB;AAClE,WAAK,UAAU,MAAM,CAAC,OAAO,WAAW,OAAO,GAAG,EAAE,QAAQ,OAAO,CAAC;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EAEO,OAAO,QAAgB,UAAe,CAAC,GAAG;AAC/C,UAAM,SAAS,IAAI,OAAO;AAE1B,WAAO,YAAY;AACnB,WAAO,YAAY,OAAO;AAE1B,QAAI,QAAQ,MAAM;AAChB,aAAO,OAAO,QAAQ;AAAA,IACxB;AAEA,SAAK,MAAM,QAAQ,IAAI,OAAO,WAAW,MAAM;AAAA,EACjD;AAAA,EAEA,MAAa,QAAQ,QAAgB,WAAoB;AACvD,QAAI,KAAK,wBAAwB,GAAG;AAClC,YAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,OAAO,SAAS;AACtD,aAAO,YAAY;AAEnB,UAAI;AACF,YAAI,WAAW;AACb,gBAAM,IAAI,MAAM,iBAAiB;AAAA,QACnC;AAEA,cAAM,KAAK,kBAAkB,QAAQ,KAAK,qBAAqB;AAC/D,eAAO,YAAY;AAAA,MAErB,SAAS,GAAP;AACA,aAAK,MAAM,QAAQ,OAAO,OAAO,SAAS;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEF;",
4
+ "sourcesContent": ["import { defineTypes, MapSchema, Schema } from '@colyseus/schema';\n\nimport { Room } from '../Room';\nimport { Client } from '../Transport';\n\nclass Player extends Schema { // tslint:disable-line\n public connected: boolean;\n public name: string;\n public sessionId: string;\n}\ndefineTypes(Player, {\n connected: 'boolean',\n name: 'string',\n sessionId: 'string',\n});\n\nclass State extends Schema { // tslint:disable-line\n public players = new MapSchema<Player>();\n}\ndefineTypes(State, {\n players: { map: Player },\n});\n\n/**\n * client.joinOrCreate(\"relayroom\", {\n * maxClients: 10,\n * allowReconnectionTime: 20\n * });\n */\n\nexport class RelayRoom extends Room<State> { // tslint:disable-line\n public allowReconnectionTime: number = 0;\n\n public onCreate(options: Partial<{\n maxClients: number,\n allowReconnectionTime: number,\n metadata: any,\n }>) {\n this.setState(new State());\n\n if (options.maxClients) {\n this.maxClients = options.maxClients;\n }\n\n if (options.allowReconnectionTime) {\n this.allowReconnectionTime = Math.min(options.allowReconnectionTime, 40);\n }\n\n if (options.metadata) {\n this.setMetadata(options.metadata);\n }\n\n this.onMessage('*', (client: Client, type: string, message: any) => {\n this.broadcast(type, [client.sessionId, message], { except: client });\n });\n }\n\n public onJoin(client: Client, options: any = {}) {\n const player = new Player();\n\n player.connected = true;\n player.sessionId = client.sessionId;\n\n if (options.name) {\n player.name = options.name;\n }\n\n this.state.players.set(client.sessionId, player);\n }\n\n public async onLeave(client: Client, consented: boolean) {\n if (this.allowReconnectionTime > 0) {\n const player = this.state.players.get(client.sessionId);\n player.connected = false;\n\n try {\n if (consented) {\n throw new Error('consented leave');\n }\n\n await this.allowReconnection(client, this.allowReconnectionTime);\n player.connected = true;\n\n } catch (e) {\n this.state.players.delete(client.sessionId);\n }\n }\n }\n\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+C;AAE/C,kBAAqB;AAGrB,MAAM,eAAe,qBAAO;AAI5B;AAAA,IACA,2BAAY,QAAQ;AAAA,EAClB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AACb,CAAC;AAED,MAAM,cAAc,qBAAO;AAAA,EAA3B;AAAA;AACE,SAAO,UAAU,IAAI,wBAAkB;AAAA;AACzC;AAAA,IACA,2BAAY,OAAO;AAAA,EACjB,SAAS,EAAE,KAAK,OAAO;AACzB,CAAC;AASM,MAAM,kBAAkB,iBAAY;AAAA,EAApC;AAAA;AACL,SAAO,wBAAgC;AAAA;AAAA,EAEhC,SAAS,SAIZ;AACF,SAAK,SAAS,IAAI,MAAM,CAAC;AAEzB,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAEA,QAAI,QAAQ,uBAAuB;AACjC,WAAK,wBAAwB,KAAK,IAAI,QAAQ,uBAAuB,EAAE;AAAA,IACzE;AAEA,QAAI,QAAQ,UAAU;AACpB,WAAK,YAAY,QAAQ,QAAQ;AAAA,IACnC;AAEA,SAAK,UAAU,KAAK,CAAC,QAAgB,MAAc,YAAiB;AAClE,WAAK,UAAU,MAAM,CAAC,OAAO,WAAW,OAAO,GAAG,EAAE,QAAQ,OAAO,CAAC;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EAEO,OAAO,QAAgB,UAAe,CAAC,GAAG;AAC/C,UAAM,SAAS,IAAI,OAAO;AAE1B,WAAO,YAAY;AACnB,WAAO,YAAY,OAAO;AAE1B,QAAI,QAAQ,MAAM;AAChB,aAAO,OAAO,QAAQ;AAAA,IACxB;AAEA,SAAK,MAAM,QAAQ,IAAI,OAAO,WAAW,MAAM;AAAA,EACjD;AAAA,EAEA,MAAa,QAAQ,QAAgB,WAAoB;AACvD,QAAI,KAAK,wBAAwB,GAAG;AAClC,YAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,OAAO,SAAS;AACtD,aAAO,YAAY;AAEnB,UAAI;AACF,YAAI,WAAW;AACb,gBAAM,IAAI,MAAM,iBAAiB;AAAA,QACnC;AAEA,cAAM,KAAK,kBAAkB,QAAQ,KAAK,qBAAqB;AAC/D,eAAO,YAAY;AAAA,MAErB,SAAS,GAAP;AACA,aAAK,MAAM,QAAQ,OAAO,OAAO,SAAS;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1,13 +1,12 @@
1
- import { Context, defineTypes, MapSchema, Schema } from "@colyseus/schema";
1
+ import { defineTypes, MapSchema, Schema } from "@colyseus/schema";
2
2
  import { Room } from "../Room";
3
- const context = new Context();
4
3
  class Player extends Schema {
5
4
  }
6
5
  defineTypes(Player, {
7
6
  connected: "boolean",
8
7
  name: "string",
9
8
  sessionId: "string"
10
- }, { context });
9
+ });
11
10
  class State extends Schema {
12
11
  constructor() {
13
12
  super(...arguments);
@@ -16,7 +15,7 @@ class State extends Schema {
16
15
  }
17
16
  defineTypes(State, {
18
17
  players: { map: Player }
19
- }, { context });
18
+ });
20
19
  class RelayRoom extends Room {
21
20
  constructor() {
22
21
  super(...arguments);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/rooms/RelayRoom.ts"],
4
- "sourcesContent": ["import { Context, defineTypes, MapSchema, Schema } from '@colyseus/schema';\n\nimport { Room } from '../Room';\nimport { Client } from '../Transport';\n\n/**\n * Create another context to avoid these types from being in the user's global `Context`\n */\nconst context = new Context();\n\nclass Player extends Schema { // tslint:disable-line\n public connected: boolean;\n public name: string;\n public sessionId: string;\n}\ndefineTypes(Player, {\n connected: 'boolean',\n name: 'string',\n sessionId: 'string',\n}, { context });\n\nclass State extends Schema { // tslint:disable-line\n public players = new MapSchema<Player>();\n}\ndefineTypes(State, {\n players: { map: Player },\n}, { context });\n\n/**\n * client.joinOrCreate(\"relayroom\", {\n * maxClients: 10,\n * allowReconnectionTime: 20\n * });\n */\n\nexport class RelayRoom extends Room<State> { // tslint:disable-line\n public allowReconnectionTime: number = 0;\n\n public onCreate(options: Partial<{\n maxClients: number,\n allowReconnectionTime: number,\n metadata: any,\n }>) {\n this.setState(new State());\n\n if (options.maxClients) {\n this.maxClients = options.maxClients;\n }\n\n if (options.allowReconnectionTime) {\n this.allowReconnectionTime = Math.min(options.allowReconnectionTime, 40);\n }\n\n if (options.metadata) {\n this.setMetadata(options.metadata);\n }\n\n this.onMessage('*', (client: Client, type: string, message: any) => {\n this.broadcast(type, [client.sessionId, message], { except: client });\n });\n }\n\n public onJoin(client: Client, options: any = {}) {\n const player = new Player();\n\n player.connected = true;\n player.sessionId = client.sessionId;\n\n if (options.name) {\n player.name = options.name;\n }\n\n this.state.players.set(client.sessionId, player);\n }\n\n public async onLeave(client: Client, consented: boolean) {\n if (this.allowReconnectionTime > 0) {\n const player = this.state.players.get(client.sessionId);\n player.connected = false;\n\n try {\n if (consented) {\n throw new Error('consented leave');\n }\n\n await this.allowReconnection(client, this.allowReconnectionTime);\n player.connected = true;\n\n } catch (e) {\n this.state.players.delete(client.sessionId);\n }\n }\n }\n\n}\n"],
5
- "mappings": "AAAA,SAAS,SAAS,aAAa,WAAW,cAAc;AAExD,SAAS,YAAY;AAMrB,MAAM,UAAU,IAAI,QAAQ;AAE5B,MAAM,eAAe,OAAO;AAI5B;AACA,YAAY,QAAQ;AAAA,EAClB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AACb,GAAG,EAAE,QAAQ,CAAC;AAEd,MAAM,cAAc,OAAO;AAAA,EAA3B;AAAA;AACE,SAAO,UAAU,IAAI,UAAkB;AAAA;AACzC;AACA,YAAY,OAAO;AAAA,EACjB,SAAS,EAAE,KAAK,OAAO;AACzB,GAAG,EAAE,QAAQ,CAAC;AASP,MAAM,kBAAkB,KAAY;AAAA,EAApC;AAAA;AACL,SAAO,wBAAgC;AAAA;AAAA,EAEhC,SAAS,SAIZ;AACF,SAAK,SAAS,IAAI,MAAM,CAAC;AAEzB,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAEA,QAAI,QAAQ,uBAAuB;AACjC,WAAK,wBAAwB,KAAK,IAAI,QAAQ,uBAAuB,EAAE;AAAA,IACzE;AAEA,QAAI,QAAQ,UAAU;AACpB,WAAK,YAAY,QAAQ,QAAQ;AAAA,IACnC;AAEA,SAAK,UAAU,KAAK,CAAC,QAAgB,MAAc,YAAiB;AAClE,WAAK,UAAU,MAAM,CAAC,OAAO,WAAW,OAAO,GAAG,EAAE,QAAQ,OAAO,CAAC;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EAEO,OAAO,QAAgB,UAAe,CAAC,GAAG;AAC/C,UAAM,SAAS,IAAI,OAAO;AAE1B,WAAO,YAAY;AACnB,WAAO,YAAY,OAAO;AAE1B,QAAI,QAAQ,MAAM;AAChB,aAAO,OAAO,QAAQ;AAAA,IACxB;AAEA,SAAK,MAAM,QAAQ,IAAI,OAAO,WAAW,MAAM;AAAA,EACjD;AAAA,EAEA,MAAa,QAAQ,QAAgB,WAAoB;AACvD,QAAI,KAAK,wBAAwB,GAAG;AAClC,YAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,OAAO,SAAS;AACtD,aAAO,YAAY;AAEnB,UAAI;AACF,YAAI,WAAW;AACb,gBAAM,IAAI,MAAM,iBAAiB;AAAA,QACnC;AAEA,cAAM,KAAK,kBAAkB,QAAQ,KAAK,qBAAqB;AAC/D,eAAO,YAAY;AAAA,MAErB,SAAS,GAAP;AACA,aAAK,MAAM,QAAQ,OAAO,OAAO,SAAS;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEF;",
4
+ "sourcesContent": ["import { defineTypes, MapSchema, Schema } from '@colyseus/schema';\n\nimport { Room } from '../Room';\nimport { Client } from '../Transport';\n\nclass Player extends Schema { // tslint:disable-line\n public connected: boolean;\n public name: string;\n public sessionId: string;\n}\ndefineTypes(Player, {\n connected: 'boolean',\n name: 'string',\n sessionId: 'string',\n});\n\nclass State extends Schema { // tslint:disable-line\n public players = new MapSchema<Player>();\n}\ndefineTypes(State, {\n players: { map: Player },\n});\n\n/**\n * client.joinOrCreate(\"relayroom\", {\n * maxClients: 10,\n * allowReconnectionTime: 20\n * });\n */\n\nexport class RelayRoom extends Room<State> { // tslint:disable-line\n public allowReconnectionTime: number = 0;\n\n public onCreate(options: Partial<{\n maxClients: number,\n allowReconnectionTime: number,\n metadata: any,\n }>) {\n this.setState(new State());\n\n if (options.maxClients) {\n this.maxClients = options.maxClients;\n }\n\n if (options.allowReconnectionTime) {\n this.allowReconnectionTime = Math.min(options.allowReconnectionTime, 40);\n }\n\n if (options.metadata) {\n this.setMetadata(options.metadata);\n }\n\n this.onMessage('*', (client: Client, type: string, message: any) => {\n this.broadcast(type, [client.sessionId, message], { except: client });\n });\n }\n\n public onJoin(client: Client, options: any = {}) {\n const player = new Player();\n\n player.connected = true;\n player.sessionId = client.sessionId;\n\n if (options.name) {\n player.name = options.name;\n }\n\n this.state.players.set(client.sessionId, player);\n }\n\n public async onLeave(client: Client, consented: boolean) {\n if (this.allowReconnectionTime > 0) {\n const player = this.state.players.get(client.sessionId);\n player.connected = false;\n\n try {\n if (consented) {\n throw new Error('consented leave');\n }\n\n await this.allowReconnection(client, this.allowReconnectionTime);\n player.connected = true;\n\n } catch (e) {\n this.state.players.delete(client.sessionId);\n }\n }\n }\n\n}\n"],
5
+ "mappings": "AAAA,SAAS,aAAa,WAAW,cAAc;AAE/C,SAAS,YAAY;AAGrB,MAAM,eAAe,OAAO;AAI5B;AACA,YAAY,QAAQ;AAAA,EAClB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AACb,CAAC;AAED,MAAM,cAAc,OAAO;AAAA,EAA3B;AAAA;AACE,SAAO,UAAU,IAAI,UAAkB;AAAA;AACzC;AACA,YAAY,OAAO;AAAA,EACjB,SAAS,EAAE,KAAK,OAAO;AACzB,CAAC;AASM,MAAM,kBAAkB,KAAY;AAAA,EAApC;AAAA;AACL,SAAO,wBAAgC;AAAA;AAAA,EAEhC,SAAS,SAIZ;AACF,SAAK,SAAS,IAAI,MAAM,CAAC;AAEzB,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAEA,QAAI,QAAQ,uBAAuB;AACjC,WAAK,wBAAwB,KAAK,IAAI,QAAQ,uBAAuB,EAAE;AAAA,IACzE;AAEA,QAAI,QAAQ,UAAU;AACpB,WAAK,YAAY,QAAQ,QAAQ;AAAA,IACnC;AAEA,SAAK,UAAU,KAAK,CAAC,QAAgB,MAAc,YAAiB;AAClE,WAAK,UAAU,MAAM,CAAC,OAAO,WAAW,OAAO,GAAG,EAAE,QAAQ,OAAO,CAAC;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EAEO,OAAO,QAAgB,UAAe,CAAC,GAAG;AAC/C,UAAM,SAAS,IAAI,OAAO;AAE1B,WAAO,YAAY;AACnB,WAAO,YAAY,OAAO;AAE1B,QAAI,QAAQ,MAAM;AAChB,aAAO,OAAO,QAAQ;AAAA,IACxB;AAEA,SAAK,MAAM,QAAQ,IAAI,OAAO,WAAW,MAAM;AAAA,EACjD;AAAA,EAEA,MAAa,QAAQ,QAAgB,WAAoB;AACvD,QAAI,KAAK,wBAAwB,GAAG;AAClC,YAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,OAAO,SAAS;AACtD,aAAO,YAAY;AAEnB,UAAI;AACF,YAAI,WAAW;AACb,gBAAM,IAAI,MAAM,iBAAiB;AAAA,QACnC;AAEA,cAAM,KAAK,kBAAkB,QAAQ,KAAK,qBAAqB;AAC/D,eAAO,YAAY;AAAA,MAErB,SAAS,GAAP;AACA,aAAK,MAAM,QAAQ,OAAO,OAAO,SAAS;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1,15 +1,18 @@
1
- import { Client } from '..';
1
+ /// <reference types="node" />
2
2
  import { Serializer } from './Serializer';
3
3
  import { Schema } from '@colyseus/schema';
4
+ import { Client } from '../Transport';
4
5
  export declare class SchemaSerializer<T> implements Serializer<T> {
5
6
  id: string;
6
- private state;
7
- private useFilters;
7
+ private encoder;
8
+ private hasFilters;
8
9
  private handshakeCache;
10
+ private fullEncodeCache;
11
+ private sharedOffsetCache;
12
+ private views;
9
13
  private needFullEncode;
10
- private fullEncodedState;
11
14
  reset(newState: T & Schema): void;
12
- getFullState(client?: Client): number[];
15
+ getFullState(client?: Client): Buffer;
13
16
  applyPatches(clients: Client[]): boolean;
14
- handshake(): number[];
17
+ handshake(): Buffer;
15
18
  }
@@ -23,68 +23,84 @@ module.exports = __toCommonJS(SchemaSerializer_exports);
23
23
  var import_schema = require("@colyseus/schema");
24
24
  var import_Debug = require("../Debug");
25
25
  var import_Protocol = require("../Protocol");
26
- var import_Transport = require("../Transport");
26
+ const STATE_PATCH_BUFFER = Buffer.from([import_Protocol.Protocol.ROOM_STATE_PATCH]);
27
+ const SHARED_VIEW = {};
27
28
  class SchemaSerializer {
28
29
  constructor() {
29
30
  this.id = "schema";
30
- this.useFilters = false;
31
+ this.hasFilters = false;
32
+ this.sharedOffsetCache = { offset: 0 };
33
+ this.views = /* @__PURE__ */ new WeakMap();
31
34
  this.needFullEncode = true;
32
35
  }
33
36
  reset(newState) {
34
- this.state = newState;
35
- this.useFilters = (0, import_schema.hasFilter)(newState.constructor);
37
+ this.encoder = new import_schema.Encoder(newState);
38
+ this.hasFilters = this.encoder.context.hasFilters;
39
+ if (this.hasFilters) {
40
+ this.views = /* @__PURE__ */ new WeakMap();
41
+ }
36
42
  }
37
43
  getFullState(client) {
38
- const fullEncodedState = this.needFullEncode ? this.state.encodeAll(this.useFilters) : this.fullEncodedState;
39
- this.fullEncodedState = fullEncodedState;
40
- this.needFullEncode = false;
41
- if (client && this.useFilters) {
42
- return this.state.applyFilters(client, true);
44
+ if (this.needFullEncode) {
45
+ this.encoder.sharedBuffer[0] = import_Protocol.Protocol.ROOM_STATE;
46
+ this.sharedOffsetCache = { offset: 1 };
47
+ this.fullEncodeCache = this.encoder.encodeAll(this.sharedOffsetCache);
48
+ this.needFullEncode = false;
49
+ }
50
+ if (this.hasFilters && client?.view) {
51
+ return this.encoder.encodeAllView(
52
+ client.view,
53
+ this.sharedOffsetCache.offset,
54
+ { ...this.sharedOffsetCache },
55
+ this.fullEncodeCache
56
+ );
43
57
  } else {
44
- return fullEncodedState;
58
+ return this.fullEncodeCache;
45
59
  }
46
60
  }
47
61
  applyPatches(clients) {
48
- const hasChanges = this.state["$changes"].changes.size > 0;
49
- if (hasChanges) {
50
- this.needFullEncode = true;
51
- let numClients = clients.length;
52
- if (import_Debug.debugPatch.enabled) {
53
- import_Debug.debugPatch.dumpChanges = (0, import_schema.dumpChanges)(this.state);
62
+ this.needFullEncode = this.encoder.root.changes.size > 0;
63
+ if (!this.needFullEncode && (!this.hasFilters || this.encoder.root.filteredChanges.size === 0)) {
64
+ return false;
65
+ }
66
+ let numClients = clients.length;
67
+ if (import_Debug.debugPatch.enabled) {
68
+ import_Debug.debugPatch.dumpChanges = (0, import_schema.dumpChanges)(this.encoder.state);
69
+ }
70
+ const it = { offset: 0 };
71
+ const encodedChanges = this.encoder.encode(it);
72
+ if (!this.hasFilters) {
73
+ const sharedChanges = Buffer.concat([STATE_PATCH_BUFFER, encodedChanges]);
74
+ while (numClients--) {
75
+ clients[numClients].raw(sharedChanges);
54
76
  }
55
- const patches = this.state.encode(false, [], this.useFilters);
56
- if (!this.useFilters) {
57
- patches.unshift(import_Protocol.Protocol.ROOM_STATE_PATCH);
58
- while (numClients--) {
59
- const client = clients[numClients];
60
- if (client.state === import_Transport.ClientState.JOINED) {
61
- client.raw(patches);
62
- }
63
- }
64
- } else {
65
- while (numClients--) {
66
- const client = clients[numClients];
67
- if (client.state === import_Transport.ClientState.JOINED) {
68
- const filteredPatches = this.state.applyFilters(client);
69
- client.raw([import_Protocol.Protocol.ROOM_STATE_PATCH, ...filteredPatches]);
70
- }
77
+ } else {
78
+ const sharedOffset = it.offset;
79
+ while (numClients--) {
80
+ const client = clients[numClients];
81
+ const view = client.view || SHARED_VIEW;
82
+ let encodedView = this.views.get(view);
83
+ if (encodedView === void 0) {
84
+ encodedView = view === SHARED_VIEW ? Buffer.concat([STATE_PATCH_BUFFER, encodedChanges]) : this.encoder.encodeView(client.view, sharedOffset, it);
85
+ this.views.set(view, encodedView);
71
86
  }
72
- this.state.discardAllChanges();
73
- }
74
- if (import_Debug.debugPatch.enabled) {
75
- (0, import_Debug.debugPatch)(
76
- "%d bytes sent to %d clients, %j",
77
- patches.length,
78
- clients.length,
79
- import_Debug.debugPatch.dumpChanges
80
- );
87
+ client.raw(Buffer.concat([STATE_PATCH_BUFFER, encodedView]));
81
88
  }
82
89
  }
83
- return hasChanges;
90
+ this.encoder.discardChanges();
91
+ if (import_Debug.debugPatch.enabled) {
92
+ (0, import_Debug.debugPatch)(
93
+ "%d bytes sent to %d clients, %j",
94
+ encodedChanges.length,
95
+ clients.length,
96
+ import_Debug.debugPatch.dumpChanges
97
+ );
98
+ }
99
+ return true;
84
100
  }
85
101
  handshake() {
86
102
  if (!this.handshakeCache) {
87
- this.handshakeCache = this.state && import_schema.Reflection.encode(this.state);
103
+ this.handshakeCache = this.encoder.state && import_schema.Reflection.encode(this.encoder.state);
88
104
  }
89
105
  return this.handshakeCache;
90
106
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/serializer/SchemaSerializer.ts"],
4
- "sourcesContent": ["/* tslint:disable:no-string-literal */\n\nimport { Client } from '..';\nimport { Serializer } from './Serializer';\n\nimport { dumpChanges, hasFilter, Reflection, Schema } from '@colyseus/schema';\nimport { debugPatch } from '../Debug';\nimport { Protocol } from '../Protocol';\nimport { ClientState } from '../Transport';\n\nexport class SchemaSerializer<T> implements Serializer<T> {\n public id = 'schema';\n\n private state: T & Schema;\n private useFilters: boolean = false;\n\n private handshakeCache: number[];\n\n private needFullEncode = true;\n private fullEncodedState: number[];\n\n public reset(newState: T & Schema) {\n this.state = newState;\n this.useFilters = hasFilter(newState.constructor as typeof Schema);\n }\n\n public getFullState(client?: Client) {\n const fullEncodedState = (this.needFullEncode)\n ? this.state.encodeAll(this.useFilters)\n : this.fullEncodedState;\n\n this.fullEncodedState = fullEncodedState;\n this.needFullEncode = false;\n\n if (client && this.useFilters) {\n return this.state.applyFilters(client, true);\n\n } else {\n return fullEncodedState;\n }\n }\n\n public applyPatches(clients: Client[]) {\n const hasChanges = this.state['$changes'].changes.size > 0;\n\n if (hasChanges) {\n this.needFullEncode = true;\n\n let numClients = clients.length;\n\n // dump changes for patch debugging\n if (debugPatch.enabled) {\n (debugPatch as any).dumpChanges = dumpChanges(this.state);\n }\n\n // get patch bytes\n const patches = this.state.encode(false, [], this.useFilters);\n\n if (!this.useFilters) {\n // encode changes once, for all clients\n patches.unshift(Protocol.ROOM_STATE_PATCH);\n\n while (numClients--) {\n const client = clients[numClients];\n\n //\n // FIXME: avoid this check.\n //\n if (client.state === ClientState.JOINED) {\n client.raw(patches);\n }\n }\n\n } else {\n\n // encode state multiple times, for each client\n while (numClients--) {\n const client = clients[numClients];\n\n //\n // FIXME: avoid this check.\n //\n if (client.state === ClientState.JOINED) {\n const filteredPatches = this.state.applyFilters(client);\n client.raw([Protocol.ROOM_STATE_PATCH, ...filteredPatches]);\n }\n }\n\n this.state.discardAllChanges();\n }\n\n // debug patches\n if (debugPatch.enabled) {\n debugPatch(\n '%d bytes sent to %d clients, %j',\n patches.length,\n clients.length,\n (debugPatch as any).dumpChanges,\n );\n }\n }\n\n return hasChanges;\n }\n\n public handshake() {\n /**\n * Cache handshake to avoid encoding it for each client joining\n */\n if (!this.handshakeCache) {\n this.handshakeCache = (this.state && Reflection.encode(this.state));\n }\n\n return this.handshakeCache;\n }\n\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,oBAA2D;AAC3D,mBAA2B;AAC3B,sBAAyB;AACzB,uBAA4B;AAErB,MAAM,iBAA6C;AAAA,EAAnD;AACL,SAAO,KAAK;AAGZ,SAAQ,aAAsB;AAI9B,SAAQ,iBAAiB;AAAA;AAAA,EAGlB,MAAM,UAAsB;AACjC,SAAK,QAAQ;AACb,SAAK,iBAAa,yBAAU,SAAS,WAA4B;AAAA,EACnE;AAAA,EAEO,aAAa,QAAiB;AACnC,UAAM,mBAAoB,KAAK,iBAC3B,KAAK,MAAM,UAAU,KAAK,UAAU,IACpC,KAAK;AAET,SAAK,mBAAmB;AACxB,SAAK,iBAAiB;AAEtB,QAAI,UAAU,KAAK,YAAY;AAC7B,aAAO,KAAK,MAAM,aAAa,QAAQ,IAAI;AAAA,IAE7C,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEO,aAAa,SAAmB;AACrC,UAAM,aAAa,KAAK,MAAM,YAAY,QAAQ,OAAO;AAEzD,QAAI,YAAY;AACd,WAAK,iBAAiB;AAEtB,UAAI,aAAa,QAAQ;AAGzB,UAAI,wBAAW,SAAS;AACtB,QAAC,wBAAmB,kBAAc,2BAAY,KAAK,KAAK;AAAA,MAC1D;AAGA,YAAM,UAAU,KAAK,MAAM,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU;AAE5D,UAAI,CAAC,KAAK,YAAY;AAEpB,gBAAQ,QAAQ,yBAAS,gBAAgB;AAEzC,eAAO,cAAc;AACnB,gBAAM,SAAS,QAAQ;AAKvB,cAAI,OAAO,UAAU,6BAAY,QAAQ;AACvC,mBAAO,IAAI,OAAO;AAAA,UACpB;AAAA,QACF;AAAA,MAEF,OAAO;AAGL,eAAO,cAAc;AACnB,gBAAM,SAAS,QAAQ;AAKvB,cAAI,OAAO,UAAU,6BAAY,QAAQ;AACvC,kBAAM,kBAAkB,KAAK,MAAM,aAAa,MAAM;AACtD,mBAAO,IAAI,CAAC,yBAAS,kBAAkB,GAAG,eAAe,CAAC;AAAA,UAC5D;AAAA,QACF;AAEA,aAAK,MAAM,kBAAkB;AAAA,MAC/B;AAGA,UAAI,wBAAW,SAAS;AACtB;AAAA,UACE;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACP,wBAAmB;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,YAAY;AAIjB,QAAI,CAAC,KAAK,gBAAgB;AACxB,WAAK,iBAAkB,KAAK,SAAS,yBAAW,OAAO,KAAK,KAAK;AAAA,IACnE;AAEA,WAAO,KAAK;AAAA,EACd;AAEF;",
4
+ "sourcesContent": ["import { Serializer } from './Serializer';\n\nimport { Encoder, dumpChanges, Reflection, Schema, $changes, Iterator, StateView } from '@colyseus/schema';\nimport { debugPatch } from '../Debug';\nimport { Protocol } from '../Protocol';\nimport { Client } from '../Transport';\n\nconst STATE_PATCH_BUFFER = Buffer.from([Protocol.ROOM_STATE_PATCH]);\nconst SHARED_VIEW = {};\n\nexport class SchemaSerializer<T> implements Serializer<T> {\n public id = 'schema';\n\n private encoder: Encoder;\n private hasFilters: boolean = false;\n\n private handshakeCache: Buffer;\n\n private fullEncodeCache: Buffer;\n private sharedOffsetCache: Iterator = { offset: 0 };\n\n private views: WeakMap<StateView | typeof SHARED_VIEW, Buffer> = new WeakMap();\n\n // flag to avoid re-encoding full state if no changes were made\n private needFullEncode: boolean = true;\n\n public reset(newState: T & Schema) {\n this.encoder = new Encoder(newState);\n this.hasFilters = this.encoder.context.hasFilters;\n\n if (this.hasFilters) {\n this.views = new WeakMap();\n }\n }\n\n public getFullState(client?: Client) {\n if (this.needFullEncode) {\n // cache ROOM_STATE byte as part of the encoded buffer\n this.encoder.sharedBuffer[0] = Protocol.ROOM_STATE;\n\n this.sharedOffsetCache = { offset: 1 };\n this.fullEncodeCache = this.encoder.encodeAll(this.sharedOffsetCache);\n this.needFullEncode = false;\n }\n\n if (this.hasFilters && client?.view) {\n return this.encoder.encodeAllView(\n client.view,\n this.sharedOffsetCache.offset,\n { ...this.sharedOffsetCache },\n this.fullEncodeCache\n );\n\n } else {\n return this.fullEncodeCache;\n }\n }\n\n public applyPatches(clients: Client[]) {\n this.needFullEncode = (this.encoder.root.changes.size > 0);\n\n if (\n !this.needFullEncode &&\n (!this.hasFilters || this.encoder.root.filteredChanges.size === 0)\n ) {\n return false;\n }\n\n let numClients = clients.length;\n\n // dump changes for patch debugging\n if (debugPatch.enabled) {\n (debugPatch as any).dumpChanges = dumpChanges(this.encoder.state);\n }\n\n // get patch bytes\n const it: Iterator = { offset: 0 };\n const encodedChanges = this.encoder.encode(it);\n\n if (!this.hasFilters) {\n // encode changes once, for all clients\n const sharedChanges = Buffer.concat([STATE_PATCH_BUFFER, encodedChanges]);\n\n while (numClients--) {\n clients[numClients].raw(sharedChanges);\n }\n\n } else {\n // cache shared offset\n const sharedOffset = it.offset;\n\n // encode state multiple times, for each client\n while (numClients--) {\n const client = clients[numClients];\n const view = client.view || SHARED_VIEW;\n\n let encodedView = this.views.get(view);\n if (encodedView === undefined) {\n encodedView = (view === SHARED_VIEW)\n ? Buffer.concat([STATE_PATCH_BUFFER, encodedChanges])\n : this.encoder.encodeView(client.view, sharedOffset, it);\n this.views.set(view, encodedView);\n }\n\n client.raw(Buffer.concat([STATE_PATCH_BUFFER, encodedView]));\n }\n }\n\n // discard changes after sending\n this.encoder.discardChanges();\n\n // debug patches\n if (debugPatch.enabled) {\n debugPatch(\n '%d bytes sent to %d clients, %j',\n encodedChanges.length,\n clients.length,\n (debugPatch as any).dumpChanges,\n );\n }\n\n return true;\n }\n\n public handshake() {\n /**\n * Cache handshake to avoid encoding it for each client joining\n */\n if (!this.handshakeCache) {\n this.handshakeCache = (this.encoder.state && Reflection.encode(this.encoder.state));\n }\n\n return this.handshakeCache;\n }\n\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,oBAAwF;AACxF,mBAA2B;AAC3B,sBAAyB;AAGzB,MAAM,qBAAqB,OAAO,KAAK,CAAC,yBAAS,gBAAgB,CAAC;AAClE,MAAM,cAAc,CAAC;AAEd,MAAM,iBAA6C;AAAA,EAAnD;AACL,SAAO,KAAK;AAGZ,SAAQ,aAAsB;AAK9B,SAAQ,oBAA8B,EAAE,QAAQ,EAAE;AAElD,SAAQ,QAAyD,oBAAI,QAAQ;AAG7E,SAAQ,iBAA0B;AAAA;AAAA,EAE3B,MAAM,UAAsB;AACjC,SAAK,UAAU,IAAI,sBAAQ,QAAQ;AACnC,SAAK,aAAa,KAAK,QAAQ,QAAQ;AAEvC,QAAI,KAAK,YAAY;AACnB,WAAK,QAAQ,oBAAI,QAAQ;AAAA,IAC3B;AAAA,EACF;AAAA,EAEO,aAAa,QAAiB;AACnC,QAAI,KAAK,gBAAgB;AAEvB,WAAK,QAAQ,aAAa,KAAK,yBAAS;AAExC,WAAK,oBAAoB,EAAE,QAAQ,EAAE;AACrC,WAAK,kBAAkB,KAAK,QAAQ,UAAU,KAAK,iBAAiB;AACpE,WAAK,iBAAiB;AAAA,IACxB;AAEA,QAAI,KAAK,cAAc,QAAQ,MAAM;AACnC,aAAO,KAAK,QAAQ;AAAA,QAClB,OAAO;AAAA,QACP,KAAK,kBAAkB;AAAA,QACvB,EAAE,GAAG,KAAK,kBAAkB;AAAA,QAC5B,KAAK;AAAA,MACP;AAAA,IAEF,OAAO;AACL,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEO,aAAa,SAAmB;AACrC,SAAK,iBAAkB,KAAK,QAAQ,KAAK,QAAQ,OAAO;AAExD,QACE,CAAC,KAAK,mBACL,CAAC,KAAK,cAAc,KAAK,QAAQ,KAAK,gBAAgB,SAAS,IAChE;AACA,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,QAAQ;AAGzB,QAAI,wBAAW,SAAS;AACtB,MAAC,wBAAmB,kBAAc,2BAAY,KAAK,QAAQ,KAAK;AAAA,IAClE;AAGA,UAAM,KAAe,EAAE,QAAQ,EAAE;AACjC,UAAM,iBAAiB,KAAK,QAAQ,OAAO,EAAE;AAE7C,QAAI,CAAC,KAAK,YAAY;AAEpB,YAAM,gBAAgB,OAAO,OAAO,CAAC,oBAAoB,cAAc,CAAC;AAExE,aAAO,cAAc;AACnB,gBAAQ,YAAY,IAAI,aAAa;AAAA,MACvC;AAAA,IAEF,OAAO;AAEL,YAAM,eAAe,GAAG;AAGxB,aAAO,cAAc;AACnB,cAAM,SAAS,QAAQ;AACvB,cAAM,OAAO,OAAO,QAAQ;AAE5B,YAAI,cAAc,KAAK,MAAM,IAAI,IAAI;AACrC,YAAI,gBAAgB,QAAW;AAC7B,wBAAe,SAAS,cACpB,OAAO,OAAO,CAAC,oBAAoB,cAAc,CAAC,IAClD,KAAK,QAAQ,WAAW,OAAO,MAAM,cAAc,EAAE;AACzD,eAAK,MAAM,IAAI,MAAM,WAAW;AAAA,QAClC;AAEA,eAAO,IAAI,OAAO,OAAO,CAAC,oBAAoB,WAAW,CAAC,CAAC;AAAA,MAC7D;AAAA,IACF;AAGA,SAAK,QAAQ,eAAe;AAG5B,QAAI,wBAAW,SAAS;AACtB;AAAA,QACE;AAAA,QACA,eAAe;AAAA,QACf,QAAQ;AAAA,QACP,wBAAmB;AAAA,MACtB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,YAAY;AAIjB,QAAI,CAAC,KAAK,gBAAgB;AACxB,WAAK,iBAAkB,KAAK,QAAQ,SAAS,yBAAW,OAAO,KAAK,QAAQ,KAAK;AAAA,IACnF;AAEA,WAAO,KAAK;AAAA,EACd;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1,68 +1,84 @@
1
- import { dumpChanges, hasFilter, Reflection } from "@colyseus/schema";
1
+ import { Encoder, dumpChanges, Reflection } from "@colyseus/schema";
2
2
  import { debugPatch } from "../Debug";
3
3
  import { Protocol } from "../Protocol";
4
- import { ClientState } from "../Transport";
4
+ const STATE_PATCH_BUFFER = Buffer.from([Protocol.ROOM_STATE_PATCH]);
5
+ const SHARED_VIEW = {};
5
6
  class SchemaSerializer {
6
7
  constructor() {
7
8
  this.id = "schema";
8
- this.useFilters = false;
9
+ this.hasFilters = false;
10
+ this.sharedOffsetCache = { offset: 0 };
11
+ this.views = /* @__PURE__ */ new WeakMap();
9
12
  this.needFullEncode = true;
10
13
  }
11
14
  reset(newState) {
12
- this.state = newState;
13
- this.useFilters = hasFilter(newState.constructor);
15
+ this.encoder = new Encoder(newState);
16
+ this.hasFilters = this.encoder.context.hasFilters;
17
+ if (this.hasFilters) {
18
+ this.views = /* @__PURE__ */ new WeakMap();
19
+ }
14
20
  }
15
21
  getFullState(client) {
16
- const fullEncodedState = this.needFullEncode ? this.state.encodeAll(this.useFilters) : this.fullEncodedState;
17
- this.fullEncodedState = fullEncodedState;
18
- this.needFullEncode = false;
19
- if (client && this.useFilters) {
20
- return this.state.applyFilters(client, true);
22
+ if (this.needFullEncode) {
23
+ this.encoder.sharedBuffer[0] = Protocol.ROOM_STATE;
24
+ this.sharedOffsetCache = { offset: 1 };
25
+ this.fullEncodeCache = this.encoder.encodeAll(this.sharedOffsetCache);
26
+ this.needFullEncode = false;
27
+ }
28
+ if (this.hasFilters && client?.view) {
29
+ return this.encoder.encodeAllView(
30
+ client.view,
31
+ this.sharedOffsetCache.offset,
32
+ { ...this.sharedOffsetCache },
33
+ this.fullEncodeCache
34
+ );
21
35
  } else {
22
- return fullEncodedState;
36
+ return this.fullEncodeCache;
23
37
  }
24
38
  }
25
39
  applyPatches(clients) {
26
- const hasChanges = this.state["$changes"].changes.size > 0;
27
- if (hasChanges) {
28
- this.needFullEncode = true;
29
- let numClients = clients.length;
30
- if (debugPatch.enabled) {
31
- debugPatch.dumpChanges = dumpChanges(this.state);
40
+ this.needFullEncode = this.encoder.root.changes.size > 0;
41
+ if (!this.needFullEncode && (!this.hasFilters || this.encoder.root.filteredChanges.size === 0)) {
42
+ return false;
43
+ }
44
+ let numClients = clients.length;
45
+ if (debugPatch.enabled) {
46
+ debugPatch.dumpChanges = dumpChanges(this.encoder.state);
47
+ }
48
+ const it = { offset: 0 };
49
+ const encodedChanges = this.encoder.encode(it);
50
+ if (!this.hasFilters) {
51
+ const sharedChanges = Buffer.concat([STATE_PATCH_BUFFER, encodedChanges]);
52
+ while (numClients--) {
53
+ clients[numClients].raw(sharedChanges);
32
54
  }
33
- const patches = this.state.encode(false, [], this.useFilters);
34
- if (!this.useFilters) {
35
- patches.unshift(Protocol.ROOM_STATE_PATCH);
36
- while (numClients--) {
37
- const client = clients[numClients];
38
- if (client.state === ClientState.JOINED) {
39
- client.raw(patches);
40
- }
41
- }
42
- } else {
43
- while (numClients--) {
44
- const client = clients[numClients];
45
- if (client.state === ClientState.JOINED) {
46
- const filteredPatches = this.state.applyFilters(client);
47
- client.raw([Protocol.ROOM_STATE_PATCH, ...filteredPatches]);
48
- }
55
+ } else {
56
+ const sharedOffset = it.offset;
57
+ while (numClients--) {
58
+ const client = clients[numClients];
59
+ const view = client.view || SHARED_VIEW;
60
+ let encodedView = this.views.get(view);
61
+ if (encodedView === void 0) {
62
+ encodedView = view === SHARED_VIEW ? Buffer.concat([STATE_PATCH_BUFFER, encodedChanges]) : this.encoder.encodeView(client.view, sharedOffset, it);
63
+ this.views.set(view, encodedView);
49
64
  }
50
- this.state.discardAllChanges();
51
- }
52
- if (debugPatch.enabled) {
53
- debugPatch(
54
- "%d bytes sent to %d clients, %j",
55
- patches.length,
56
- clients.length,
57
- debugPatch.dumpChanges
58
- );
65
+ client.raw(Buffer.concat([STATE_PATCH_BUFFER, encodedView]));
59
66
  }
60
67
  }
61
- return hasChanges;
68
+ this.encoder.discardChanges();
69
+ if (debugPatch.enabled) {
70
+ debugPatch(
71
+ "%d bytes sent to %d clients, %j",
72
+ encodedChanges.length,
73
+ clients.length,
74
+ debugPatch.dumpChanges
75
+ );
76
+ }
77
+ return true;
62
78
  }
63
79
  handshake() {
64
80
  if (!this.handshakeCache) {
65
- this.handshakeCache = this.state && Reflection.encode(this.state);
81
+ this.handshakeCache = this.encoder.state && Reflection.encode(this.encoder.state);
66
82
  }
67
83
  return this.handshakeCache;
68
84
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/serializer/SchemaSerializer.ts"],
4
- "sourcesContent": ["/* tslint:disable:no-string-literal */\n\nimport { Client } from '..';\nimport { Serializer } from './Serializer';\n\nimport { dumpChanges, hasFilter, Reflection, Schema } from '@colyseus/schema';\nimport { debugPatch } from '../Debug';\nimport { Protocol } from '../Protocol';\nimport { ClientState } from '../Transport';\n\nexport class SchemaSerializer<T> implements Serializer<T> {\n public id = 'schema';\n\n private state: T & Schema;\n private useFilters: boolean = false;\n\n private handshakeCache: number[];\n\n private needFullEncode = true;\n private fullEncodedState: number[];\n\n public reset(newState: T & Schema) {\n this.state = newState;\n this.useFilters = hasFilter(newState.constructor as typeof Schema);\n }\n\n public getFullState(client?: Client) {\n const fullEncodedState = (this.needFullEncode)\n ? this.state.encodeAll(this.useFilters)\n : this.fullEncodedState;\n\n this.fullEncodedState = fullEncodedState;\n this.needFullEncode = false;\n\n if (client && this.useFilters) {\n return this.state.applyFilters(client, true);\n\n } else {\n return fullEncodedState;\n }\n }\n\n public applyPatches(clients: Client[]) {\n const hasChanges = this.state['$changes'].changes.size > 0;\n\n if (hasChanges) {\n this.needFullEncode = true;\n\n let numClients = clients.length;\n\n // dump changes for patch debugging\n if (debugPatch.enabled) {\n (debugPatch as any).dumpChanges = dumpChanges(this.state);\n }\n\n // get patch bytes\n const patches = this.state.encode(false, [], this.useFilters);\n\n if (!this.useFilters) {\n // encode changes once, for all clients\n patches.unshift(Protocol.ROOM_STATE_PATCH);\n\n while (numClients--) {\n const client = clients[numClients];\n\n //\n // FIXME: avoid this check.\n //\n if (client.state === ClientState.JOINED) {\n client.raw(patches);\n }\n }\n\n } else {\n\n // encode state multiple times, for each client\n while (numClients--) {\n const client = clients[numClients];\n\n //\n // FIXME: avoid this check.\n //\n if (client.state === ClientState.JOINED) {\n const filteredPatches = this.state.applyFilters(client);\n client.raw([Protocol.ROOM_STATE_PATCH, ...filteredPatches]);\n }\n }\n\n this.state.discardAllChanges();\n }\n\n // debug patches\n if (debugPatch.enabled) {\n debugPatch(\n '%d bytes sent to %d clients, %j',\n patches.length,\n clients.length,\n (debugPatch as any).dumpChanges,\n );\n }\n }\n\n return hasChanges;\n }\n\n public handshake() {\n /**\n * Cache handshake to avoid encoding it for each client joining\n */\n if (!this.handshakeCache) {\n this.handshakeCache = (this.state && Reflection.encode(this.state));\n }\n\n return this.handshakeCache;\n }\n\n}\n"],
5
- "mappings": "AAKA,SAAS,aAAa,WAAW,kBAA0B;AAC3D,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;AAErB,MAAM,iBAA6C;AAAA,EAAnD;AACL,SAAO,KAAK;AAGZ,SAAQ,aAAsB;AAI9B,SAAQ,iBAAiB;AAAA;AAAA,EAGlB,MAAM,UAAsB;AACjC,SAAK,QAAQ;AACb,SAAK,aAAa,UAAU,SAAS,WAA4B;AAAA,EACnE;AAAA,EAEO,aAAa,QAAiB;AACnC,UAAM,mBAAoB,KAAK,iBAC3B,KAAK,MAAM,UAAU,KAAK,UAAU,IACpC,KAAK;AAET,SAAK,mBAAmB;AACxB,SAAK,iBAAiB;AAEtB,QAAI,UAAU,KAAK,YAAY;AAC7B,aAAO,KAAK,MAAM,aAAa,QAAQ,IAAI;AAAA,IAE7C,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEO,aAAa,SAAmB;AACrC,UAAM,aAAa,KAAK,MAAM,YAAY,QAAQ,OAAO;AAEzD,QAAI,YAAY;AACd,WAAK,iBAAiB;AAEtB,UAAI,aAAa,QAAQ;AAGzB,UAAI,WAAW,SAAS;AACtB,QAAC,WAAmB,cAAc,YAAY,KAAK,KAAK;AAAA,MAC1D;AAGA,YAAM,UAAU,KAAK,MAAM,OAAO,OAAO,CAAC,GAAG,KAAK,UAAU;AAE5D,UAAI,CAAC,KAAK,YAAY;AAEpB,gBAAQ,QAAQ,SAAS,gBAAgB;AAEzC,eAAO,cAAc;AACnB,gBAAM,SAAS,QAAQ;AAKvB,cAAI,OAAO,UAAU,YAAY,QAAQ;AACvC,mBAAO,IAAI,OAAO;AAAA,UACpB;AAAA,QACF;AAAA,MAEF,OAAO;AAGL,eAAO,cAAc;AACnB,gBAAM,SAAS,QAAQ;AAKvB,cAAI,OAAO,UAAU,YAAY,QAAQ;AACvC,kBAAM,kBAAkB,KAAK,MAAM,aAAa,MAAM;AACtD,mBAAO,IAAI,CAAC,SAAS,kBAAkB,GAAG,eAAe,CAAC;AAAA,UAC5D;AAAA,QACF;AAEA,aAAK,MAAM,kBAAkB;AAAA,MAC/B;AAGA,UAAI,WAAW,SAAS;AACtB;AAAA,UACE;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACP,WAAmB;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,YAAY;AAIjB,QAAI,CAAC,KAAK,gBAAgB;AACxB,WAAK,iBAAkB,KAAK,SAAS,WAAW,OAAO,KAAK,KAAK;AAAA,IACnE;AAEA,WAAO,KAAK;AAAA,EACd;AAEF;",
4
+ "sourcesContent": ["import { Serializer } from './Serializer';\n\nimport { Encoder, dumpChanges, Reflection, Schema, $changes, Iterator, StateView } from '@colyseus/schema';\nimport { debugPatch } from '../Debug';\nimport { Protocol } from '../Protocol';\nimport { Client } from '../Transport';\n\nconst STATE_PATCH_BUFFER = Buffer.from([Protocol.ROOM_STATE_PATCH]);\nconst SHARED_VIEW = {};\n\nexport class SchemaSerializer<T> implements Serializer<T> {\n public id = 'schema';\n\n private encoder: Encoder;\n private hasFilters: boolean = false;\n\n private handshakeCache: Buffer;\n\n private fullEncodeCache: Buffer;\n private sharedOffsetCache: Iterator = { offset: 0 };\n\n private views: WeakMap<StateView | typeof SHARED_VIEW, Buffer> = new WeakMap();\n\n // flag to avoid re-encoding full state if no changes were made\n private needFullEncode: boolean = true;\n\n public reset(newState: T & Schema) {\n this.encoder = new Encoder(newState);\n this.hasFilters = this.encoder.context.hasFilters;\n\n if (this.hasFilters) {\n this.views = new WeakMap();\n }\n }\n\n public getFullState(client?: Client) {\n if (this.needFullEncode) {\n // cache ROOM_STATE byte as part of the encoded buffer\n this.encoder.sharedBuffer[0] = Protocol.ROOM_STATE;\n\n this.sharedOffsetCache = { offset: 1 };\n this.fullEncodeCache = this.encoder.encodeAll(this.sharedOffsetCache);\n this.needFullEncode = false;\n }\n\n if (this.hasFilters && client?.view) {\n return this.encoder.encodeAllView(\n client.view,\n this.sharedOffsetCache.offset,\n { ...this.sharedOffsetCache },\n this.fullEncodeCache\n );\n\n } else {\n return this.fullEncodeCache;\n }\n }\n\n public applyPatches(clients: Client[]) {\n this.needFullEncode = (this.encoder.root.changes.size > 0);\n\n if (\n !this.needFullEncode &&\n (!this.hasFilters || this.encoder.root.filteredChanges.size === 0)\n ) {\n return false;\n }\n\n let numClients = clients.length;\n\n // dump changes for patch debugging\n if (debugPatch.enabled) {\n (debugPatch as any).dumpChanges = dumpChanges(this.encoder.state);\n }\n\n // get patch bytes\n const it: Iterator = { offset: 0 };\n const encodedChanges = this.encoder.encode(it);\n\n if (!this.hasFilters) {\n // encode changes once, for all clients\n const sharedChanges = Buffer.concat([STATE_PATCH_BUFFER, encodedChanges]);\n\n while (numClients--) {\n clients[numClients].raw(sharedChanges);\n }\n\n } else {\n // cache shared offset\n const sharedOffset = it.offset;\n\n // encode state multiple times, for each client\n while (numClients--) {\n const client = clients[numClients];\n const view = client.view || SHARED_VIEW;\n\n let encodedView = this.views.get(view);\n if (encodedView === undefined) {\n encodedView = (view === SHARED_VIEW)\n ? Buffer.concat([STATE_PATCH_BUFFER, encodedChanges])\n : this.encoder.encodeView(client.view, sharedOffset, it);\n this.views.set(view, encodedView);\n }\n\n client.raw(Buffer.concat([STATE_PATCH_BUFFER, encodedView]));\n }\n }\n\n // discard changes after sending\n this.encoder.discardChanges();\n\n // debug patches\n if (debugPatch.enabled) {\n debugPatch(\n '%d bytes sent to %d clients, %j',\n encodedChanges.length,\n clients.length,\n (debugPatch as any).dumpChanges,\n );\n }\n\n return true;\n }\n\n public handshake() {\n /**\n * Cache handshake to avoid encoding it for each client joining\n */\n if (!this.handshakeCache) {\n this.handshakeCache = (this.encoder.state && Reflection.encode(this.encoder.state));\n }\n\n return this.handshakeCache;\n }\n\n}\n"],
5
+ "mappings": "AAEA,SAAS,SAAS,aAAa,kBAAyD;AACxF,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AAGzB,MAAM,qBAAqB,OAAO,KAAK,CAAC,SAAS,gBAAgB,CAAC;AAClE,MAAM,cAAc,CAAC;AAEd,MAAM,iBAA6C;AAAA,EAAnD;AACL,SAAO,KAAK;AAGZ,SAAQ,aAAsB;AAK9B,SAAQ,oBAA8B,EAAE,QAAQ,EAAE;AAElD,SAAQ,QAAyD,oBAAI,QAAQ;AAG7E,SAAQ,iBAA0B;AAAA;AAAA,EAE3B,MAAM,UAAsB;AACjC,SAAK,UAAU,IAAI,QAAQ,QAAQ;AACnC,SAAK,aAAa,KAAK,QAAQ,QAAQ;AAEvC,QAAI,KAAK,YAAY;AACnB,WAAK,QAAQ,oBAAI,QAAQ;AAAA,IAC3B;AAAA,EACF;AAAA,EAEO,aAAa,QAAiB;AACnC,QAAI,KAAK,gBAAgB;AAEvB,WAAK,QAAQ,aAAa,KAAK,SAAS;AAExC,WAAK,oBAAoB,EAAE,QAAQ,EAAE;AACrC,WAAK,kBAAkB,KAAK,QAAQ,UAAU,KAAK,iBAAiB;AACpE,WAAK,iBAAiB;AAAA,IACxB;AAEA,QAAI,KAAK,cAAc,QAAQ,MAAM;AACnC,aAAO,KAAK,QAAQ;AAAA,QAClB,OAAO;AAAA,QACP,KAAK,kBAAkB;AAAA,QACvB,EAAE,GAAG,KAAK,kBAAkB;AAAA,QAC5B,KAAK;AAAA,MACP;AAAA,IAEF,OAAO;AACL,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEO,aAAa,SAAmB;AACrC,SAAK,iBAAkB,KAAK,QAAQ,KAAK,QAAQ,OAAO;AAExD,QACE,CAAC,KAAK,mBACL,CAAC,KAAK,cAAc,KAAK,QAAQ,KAAK,gBAAgB,SAAS,IAChE;AACA,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,QAAQ;AAGzB,QAAI,WAAW,SAAS;AACtB,MAAC,WAAmB,cAAc,YAAY,KAAK,QAAQ,KAAK;AAAA,IAClE;AAGA,UAAM,KAAe,EAAE,QAAQ,EAAE;AACjC,UAAM,iBAAiB,KAAK,QAAQ,OAAO,EAAE;AAE7C,QAAI,CAAC,KAAK,YAAY;AAEpB,YAAM,gBAAgB,OAAO,OAAO,CAAC,oBAAoB,cAAc,CAAC;AAExE,aAAO,cAAc;AACnB,gBAAQ,YAAY,IAAI,aAAa;AAAA,MACvC;AAAA,IAEF,OAAO;AAEL,YAAM,eAAe,GAAG;AAGxB,aAAO,cAAc;AACnB,cAAM,SAAS,QAAQ;AACvB,cAAM,OAAO,OAAO,QAAQ;AAE5B,YAAI,cAAc,KAAK,MAAM,IAAI,IAAI;AACrC,YAAI,gBAAgB,QAAW;AAC7B,wBAAe,SAAS,cACpB,OAAO,OAAO,CAAC,oBAAoB,cAAc,CAAC,IAClD,KAAK,QAAQ,WAAW,OAAO,MAAM,cAAc,EAAE;AACzD,eAAK,MAAM,IAAI,MAAM,WAAW;AAAA,QAClC;AAEA,eAAO,IAAI,OAAO,OAAO,CAAC,oBAAoB,WAAW,CAAC,CAAC;AAAA,MAC7D;AAAA,IACF;AAGA,SAAK,QAAQ,eAAe;AAG5B,QAAI,WAAW,SAAS;AACtB;AAAA,QACE;AAAA,QACA,eAAe;AAAA,QACf,QAAQ;AAAA,QACP,WAAmB;AAAA,MACtB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,YAAY;AAIjB,QAAI,CAAC,KAAK,gBAAgB;AACxB,WAAK,iBAAkB,KAAK,QAAQ,SAAS,WAAW,OAAO,KAAK,QAAQ,KAAK;AAAA,IACnF;AAEA,WAAO,KAAK;AAAA,EACd;AAEF;",
6
6
  "names": []
7
7
  }
@@ -1,8 +1,9 @@
1
+ /// <reference types="node" />
1
2
  import { Client } from '..';
2
3
  export interface Serializer<T> {
3
4
  id: string;
4
5
  reset(data: any): void;
5
- getFullState(client?: Client): any;
6
+ getFullState(client?: Client): Buffer;
6
7
  applyPatches(clients: Client[], state: T): boolean;
7
- handshake?(): number[];
8
+ handshake?(): Buffer;
8
9
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/serializer/Serializer.ts"],
4
- "sourcesContent": ["import { Client } from '..';\n\nexport interface Serializer<T> {\n id: string;\n reset(data: any): void;\n getFullState(client?: Client): any;\n applyPatches(clients: Client[], state: T): boolean;\n handshake?(): number[];\n}\n"],
4
+ "sourcesContent": ["import { Client } from '..';\n\nexport interface Serializer<T> {\n id: string;\n reset(data: any): void;\n getFullState(client?: Client): Buffer;\n applyPatches(clients: Client[], state: T): boolean;\n handshake?(): Buffer;\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,5 @@
1
1
  /// <reference types="node" />
2
- /// <reference types="node" />
3
2
  import { EventEmitter } from "events";
4
- import { ServerOpts, Socket } from "net";
5
3
  export declare const REMOTE_ROOM_SHORT_TIMEOUT: number;
6
4
  export declare function generateId(length?: number): any;
7
5
  export declare function getBearerToken(authHeader: string): string;
@@ -17,10 +15,5 @@ export declare class Deferred<T = any> {
17
15
  catch(func: (value: any) => any): Promise<any>;
18
16
  }
19
17
  export declare function merge(a: any, ...objs: any[]): any;
20
- export declare interface DummyServer {
21
- constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void): any;
22
- listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;
23
- close(callback?: (err?: Error) => void): this;
24
- }
25
- export declare class DummyServer extends EventEmitter {
18
+ export declare class HttpServerMock extends EventEmitter {
26
19
  }
@@ -24,7 +24,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
24
24
  var Utils_exports = {};
25
25
  __export(Utils_exports, {
26
26
  Deferred: () => Deferred,
27
- DummyServer: () => DummyServer,
27
+ HttpServerMock: () => HttpServerMock,
28
28
  REMOTE_ROOM_SHORT_TIMEOUT: () => REMOTE_ROOM_SHORT_TIMEOUT,
29
29
  generateId: () => generateId,
30
30
  getBearerToken: () => getBearerToken,
@@ -103,7 +103,7 @@ function merge(a, ...objs) {
103
103
  }
104
104
  return a;
105
105
  }
106
- class DummyServer extends import_events.EventEmitter {
106
+ class HttpServerMock extends import_events.EventEmitter {
107
107
  }
108
108
  (0, import_msgpackr.addExtension)({
109
109
  Class: import_schema.Schema,
@@ -118,7 +118,7 @@ class DummyServer extends import_events.EventEmitter {
118
118
  // Annotate the CommonJS export names for ESM import in node:
119
119
  0 && (module.exports = {
120
120
  Deferred,
121
- DummyServer,
121
+ HttpServerMock,
122
122
  REMOTE_ROOM_SHORT_TIMEOUT,
123
123
  generateId,
124
124
  getBearerToken,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/Utils.ts"],
4
- "sourcesContent": ["import nanoid from 'nanoid';\nimport { addExtension } from 'msgpackr';\n\nimport { debugAndPrintError } from '../Debug';\nimport { EventEmitter } from \"events\";\nimport { ServerOpts, Socket } from \"net\";\nimport { Schema } from \"@colyseus/schema\";\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\nexport function getBearerToken(authHeader: string) {\n return (authHeader && authHeader.startsWith(\"Bearer \") && authHeader.substring(7, authHeader.length)) || undefined;\n}\n\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T= any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(func: (value: T) => any) {\n return this.promise.then.apply(this.promise, arguments);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport declare interface DummyServer {\n constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void);\n\n listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;\n close(callback?: (err?: Error) => void): this;\n}\n\nexport class DummyServer extends EventEmitter {}\n\n// Add msgpackr extension to avoid circular references when encoding\n// https://github.com/kriszyp/msgpackr#custom-extensions\naddExtension({\n Class: Schema,\n type: 0,\n\n read(datum: any): any {\n return datum;\n },\n\n write(instance: any): any {\n return instance.toJSON();\n }\n});\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmB;AACnB,sBAA6B;AAE7B,mBAAmC;AACnC,oBAA6B;AAE7B,oBAAuB;AAGhB,MAAM,4BAA4B,OAAO,QAAQ,IAAI,mCAAmC,GAAI;AAE5F,SAAS,WAAW,SAAiB,GAAG;AAC7C,aAAO,cAAAA,SAAO,MAAM;AACtB;AAEO,SAAS,eAAe,YAAoB;AACjD,SAAQ,cAAc,WAAW,WAAW,SAAS,KAAK,WAAW,UAAU,GAAG,WAAW,MAAM,KAAM;AAC3G;AAKA,MAAM,UAA4B,CAAC,UAAU,WAAW,SAAS;AAE1D,SAAS,yBAAyB,UAAiC;AAIxE,UAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,yCAAmB,GAAG;AACtB,aAAS,GAAG;AAAA,EACd,CAAC;AAED,UAAQ,QAAQ,CAAC,WACf,QAAQ,KAAK,QAAQ,MAAM,SAAS,CAAC,CAAC;AAC1C;AAEO,SAAS,MACd,IACA,aAAqB,GACrB,iBAAwB,CAAC,GACzB,UAAkB,GAClB;AACA,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,OAAG,EACA,KAAK,OAAO,EACZ,MAAM,CAAC,MAAM;AACZ,UACE,eAAe,QAAQ,EAAE,WAAW,MAAM,MAC1C,YAAY,YACZ;AACA,mBAAW,MAAM;AACf,gBAAS,IAAI,YAAY,gBAAgB,OAAO,EAC9C,KAAK,OAAO,EACZ,MAAM,CAAC,OAAO,OAAO,EAAE,CAAC;AAAA,QAC5B,GAAG,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,GAAG,CAAC;AAAA,MAE3D,OAAO;AACL,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACH;AAEO,SAAS,UAAU,KAAY,OAAwB;AAG5D,MAAI,UAAU,MAAM,SAAS,IAAI,QAAQ;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,IAAI,SAAS;AACzB,WAAS,IAAI,OAAO,IAAI,KAAK,KAAK;AAChC,QAAI,KAAK,IAAI,IAAI;AAAA,EACnB;AAEA,MAAI,SAAS;AACb,SAAO;AACT;AAEO,MAAM,SAAiB;AAAA,EAM5B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEO,KAAK,MAAyB;AACnC,WAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,SAAS,SAAS;AAAA,EACxD;AAAA,EAEO,MAAM,MAA2B;AACtC,WAAO,KAAK,QAAQ,MAAM,IAAI;AAAA,EAChC;AAEF;AAEO,SAAS,MAAM,MAAW,MAAkB;AACjD,WAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;AAC/C,UAAM,IAAI,KAAK;AACf,eAAW,OAAO,GAAG;AACnB,UAAI,EAAE,eAAe,GAAG,GAAG;AACzB,UAAE,OAAO,EAAE;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AASO,MAAM,oBAAoB,2BAAa;AAAC;AAAA,IAI/C,8BAAa;AAAA,EACX,OAAO;AAAA,EACP,MAAM;AAAA,EAEN,KAAK,OAAiB;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAoB;AACxB,WAAO,SAAS,OAAO;AAAA,EACzB;AACF,CAAC;",
4
+ "sourcesContent": ["import nanoid from 'nanoid';\nimport { addExtension } from 'msgpackr';\n\nimport { debugAndPrintError } from '../Debug';\nimport { EventEmitter } from \"events\";\nimport { ServerOpts, Socket, Server } from \"net\";\nimport { Schema } from \"@colyseus/schema\";\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\nexport function getBearerToken(authHeader: string) {\n return (authHeader && authHeader.startsWith(\"Bearer \") && authHeader.substring(7, authHeader.length)) || undefined;\n}\n\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T= any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(func: (value: T) => any) {\n return this.promise.then.apply(this.promise, arguments);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport class HttpServerMock extends EventEmitter {}\n\n// Add msgpackr extension to avoid circular references when encoding\n// https://github.com/kriszyp/msgpackr#custom-extensions\naddExtension({\n Class: Schema,\n type: 0,\n\n read(datum: any): any {\n return datum;\n },\n\n write(instance: any): any {\n return instance.toJSON();\n }\n});\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmB;AACnB,sBAA6B;AAE7B,mBAAmC;AACnC,oBAA6B;AAE7B,oBAAuB;AAGhB,MAAM,4BAA4B,OAAO,QAAQ,IAAI,mCAAmC,GAAI;AAE5F,SAAS,WAAW,SAAiB,GAAG;AAC7C,aAAO,cAAAA,SAAO,MAAM;AACtB;AAEO,SAAS,eAAe,YAAoB;AACjD,SAAQ,cAAc,WAAW,WAAW,SAAS,KAAK,WAAW,UAAU,GAAG,WAAW,MAAM,KAAM;AAC3G;AAKA,MAAM,UAA4B,CAAC,UAAU,WAAW,SAAS;AAE1D,SAAS,yBAAyB,UAAiC;AAIxE,UAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,yCAAmB,GAAG;AACtB,aAAS,GAAG;AAAA,EACd,CAAC;AAED,UAAQ,QAAQ,CAAC,WACf,QAAQ,KAAK,QAAQ,MAAM,SAAS,CAAC,CAAC;AAC1C;AAEO,SAAS,MACd,IACA,aAAqB,GACrB,iBAAwB,CAAC,GACzB,UAAkB,GAClB;AACA,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,OAAG,EACA,KAAK,OAAO,EACZ,MAAM,CAAC,MAAM;AACZ,UACE,eAAe,QAAQ,EAAE,WAAW,MAAM,MAC1C,YAAY,YACZ;AACA,mBAAW,MAAM;AACf,gBAAS,IAAI,YAAY,gBAAgB,OAAO,EAC9C,KAAK,OAAO,EACZ,MAAM,CAAC,OAAO,OAAO,EAAE,CAAC;AAAA,QAC5B,GAAG,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,GAAG,CAAC;AAAA,MAE3D,OAAO;AACL,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACH;AAEO,SAAS,UAAU,KAAY,OAAwB;AAG5D,MAAI,UAAU,MAAM,SAAS,IAAI,QAAQ;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,IAAI,SAAS;AACzB,WAAS,IAAI,OAAO,IAAI,KAAK,KAAK;AAChC,QAAI,KAAK,IAAI,IAAI;AAAA,EACnB;AAEA,MAAI,SAAS;AACb,SAAO;AACT;AAEO,MAAM,SAAiB;AAAA,EAM5B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEO,KAAK,MAAyB;AACnC,WAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,SAAS,SAAS;AAAA,EACxD;AAAA,EAEO,MAAM,MAA2B;AACtC,WAAO,KAAK,QAAQ,MAAM,IAAI;AAAA,EAChC;AAEF;AAEO,SAAS,MAAM,MAAW,MAAkB;AACjD,WAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;AAC/C,UAAM,IAAI,KAAK;AACf,eAAW,OAAO,GAAG;AACnB,UAAI,EAAE,eAAe,GAAG,GAAG;AACzB,UAAE,OAAO,EAAE;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,MAAM,uBAAuB,2BAAa;AAAC;AAAA,IAIlD,8BAAa;AAAA,EACX,OAAO;AAAA,EACP,MAAM;AAAA,EAEN,KAAK,OAAiB;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAoB;AACxB,WAAO,SAAS,OAAO;AAAA,EACzB;AACF,CAAC;",
6
6
  "names": ["nanoid"]
7
7
  }
@@ -67,7 +67,7 @@ function merge(a, ...objs) {
67
67
  }
68
68
  return a;
69
69
  }
70
- class DummyServer extends EventEmitter {
70
+ class HttpServerMock extends EventEmitter {
71
71
  }
72
72
  addExtension({
73
73
  Class: Schema,
@@ -81,7 +81,7 @@ addExtension({
81
81
  });
82
82
  export {
83
83
  Deferred,
84
- DummyServer,
84
+ HttpServerMock,
85
85
  REMOTE_ROOM_SHORT_TIMEOUT,
86
86
  generateId,
87
87
  getBearerToken,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/Utils.ts"],
4
- "sourcesContent": ["import nanoid from 'nanoid';\nimport { addExtension } from 'msgpackr';\n\nimport { debugAndPrintError } from '../Debug';\nimport { EventEmitter } from \"events\";\nimport { ServerOpts, Socket } from \"net\";\nimport { Schema } from \"@colyseus/schema\";\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\nexport function getBearerToken(authHeader: string) {\n return (authHeader && authHeader.startsWith(\"Bearer \") && authHeader.substring(7, authHeader.length)) || undefined;\n}\n\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T= any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(func: (value: T) => any) {\n return this.promise.then.apply(this.promise, arguments);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport declare interface DummyServer {\n constructor(options?: ServerOpts, connectionListener?: (socket: Socket) => void);\n\n listen(port?: number, hostname?: string, backlog?: number, listeningListener?: () => void): this;\n close(callback?: (err?: Error) => void): this;\n}\n\nexport class DummyServer extends EventEmitter {}\n\n// Add msgpackr extension to avoid circular references when encoding\n// https://github.com/kriszyp/msgpackr#custom-extensions\naddExtension({\n Class: Schema,\n type: 0,\n\n read(datum: any): any {\n return datum;\n },\n\n write(instance: any): any {\n return instance.toJSON();\n }\n});\n"],
5
- "mappings": "AAAA,OAAO,YAAY;AACnB,SAAS,oBAAoB;AAE7B,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAE7B,SAAS,cAAc;AAGhB,MAAM,4BAA4B,OAAO,QAAQ,IAAI,mCAAmC,GAAI;AAE5F,SAAS,WAAW,SAAiB,GAAG;AAC7C,SAAO,OAAO,MAAM;AACtB;AAEO,SAAS,eAAe,YAAoB;AACjD,SAAQ,cAAc,WAAW,WAAW,SAAS,KAAK,WAAW,UAAU,GAAG,WAAW,MAAM,KAAM;AAC3G;AAKA,MAAM,UAA4B,CAAC,UAAU,WAAW,SAAS;AAE1D,SAAS,yBAAyB,UAAiC;AAIxE,UAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,uBAAmB,GAAG;AACtB,aAAS,GAAG;AAAA,EACd,CAAC;AAED,UAAQ,QAAQ,CAAC,WACf,QAAQ,KAAK,QAAQ,MAAM,SAAS,CAAC,CAAC;AAC1C;AAEO,SAAS,MACd,IACA,aAAqB,GACrB,iBAAwB,CAAC,GACzB,UAAkB,GAClB;AACA,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,OAAG,EACA,KAAK,OAAO,EACZ,MAAM,CAAC,MAAM;AACZ,UACE,eAAe,QAAQ,EAAE,WAAW,MAAM,MAC1C,YAAY,YACZ;AACA,mBAAW,MAAM;AACf,gBAAS,IAAI,YAAY,gBAAgB,OAAO,EAC9C,KAAK,OAAO,EACZ,MAAM,CAAC,OAAO,OAAO,EAAE,CAAC;AAAA,QAC5B,GAAG,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,GAAG,CAAC;AAAA,MAE3D,OAAO;AACL,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACH;AAEO,SAAS,UAAU,KAAY,OAAwB;AAG5D,MAAI,UAAU,MAAM,SAAS,IAAI,QAAQ;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,IAAI,SAAS;AACzB,WAAS,IAAI,OAAO,IAAI,KAAK,KAAK;AAChC,QAAI,KAAK,IAAI,IAAI;AAAA,EACnB;AAEA,MAAI,SAAS;AACb,SAAO;AACT;AAEO,MAAM,SAAiB;AAAA,EAM5B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEO,KAAK,MAAyB;AACnC,WAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,SAAS,SAAS;AAAA,EACxD;AAAA,EAEO,MAAM,MAA2B;AACtC,WAAO,KAAK,QAAQ,MAAM,IAAI;AAAA,EAChC;AAEF;AAEO,SAAS,MAAM,MAAW,MAAkB;AACjD,WAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;AAC/C,UAAM,IAAI,KAAK;AACf,eAAW,OAAO,GAAG;AACnB,UAAI,EAAE,eAAe,GAAG,GAAG;AACzB,UAAE,OAAO,EAAE;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AASO,MAAM,oBAAoB,aAAa;AAAC;AAI/C,aAAa;AAAA,EACX,OAAO;AAAA,EACP,MAAM;AAAA,EAEN,KAAK,OAAiB;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAoB;AACxB,WAAO,SAAS,OAAO;AAAA,EACzB;AACF,CAAC;",
4
+ "sourcesContent": ["import nanoid from 'nanoid';\nimport { addExtension } from 'msgpackr';\n\nimport { debugAndPrintError } from '../Debug';\nimport { EventEmitter } from \"events\";\nimport { ServerOpts, Socket, Server } from \"net\";\nimport { Schema } from \"@colyseus/schema\";\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\n\nexport function generateId(length: number = 9) {\n return nanoid(length);\n}\n\nexport function getBearerToken(authHeader: string) {\n return (authHeader && authHeader.startsWith(\"Bearer \") && authHeader.substring(7, authHeader.length)) || undefined;\n}\n\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n /**\n * Gracefully shutdown on uncaught errors\n */\n process.on('uncaughtException', (err) => {\n debugAndPrintError(err);\n callback(err);\n });\n\n signals.forEach((signal) =>\n process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n cb: Function,\n maxRetries: number = 3,\n errorWhiteList: any[] = [],\n retries: number = 0,\n) {\n return new Promise<T>((resolve, reject) => {\n cb()\n .then(resolve)\n .catch((e) => {\n if (\n errorWhiteList.indexOf(e.constructor) !== -1 &&\n retries++ < maxRetries\n ) {\n setTimeout(() => {\n retry<T>(cb, maxRetries, errorWhiteList, retries).\n then(resolve).\n catch((e2) => reject(e2));\n }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n } else {\n reject(e);\n }\n });\n });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n // manually splice availableRooms array\n // http://jsperf.com/manual-splice\n if (index === -1 || index >= arr.length) {\n return false;\n }\n\n const len = arr.length - 1;\n for (let i = index; i < len; i++) {\n arr[i] = arr[i + 1];\n }\n\n arr.length = len;\n return true;\n}\n\nexport class Deferred<T= any> {\n public promise: Promise<T>;\n\n public resolve: Function;\n public reject: Function;\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n public then(func: (value: T) => any) {\n return this.promise.then.apply(this.promise, arguments);\n }\n\n public catch(func: (value: any) => any) {\n return this.promise.catch(func);\n }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n for (let i = 0, len = objs.length; i < len; i++) {\n const b = objs[i];\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n a[key] = b[key];\n }\n }\n }\n return a;\n}\n\nexport class HttpServerMock extends EventEmitter {}\n\n// Add msgpackr extension to avoid circular references when encoding\n// https://github.com/kriszyp/msgpackr#custom-extensions\naddExtension({\n Class: Schema,\n type: 0,\n\n read(datum: any): any {\n return datum;\n },\n\n write(instance: any): any {\n return instance.toJSON();\n }\n});\n"],
5
+ "mappings": "AAAA,OAAO,YAAY;AACnB,SAAS,oBAAoB;AAE7B,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAE7B,SAAS,cAAc;AAGhB,MAAM,4BAA4B,OAAO,QAAQ,IAAI,mCAAmC,GAAI;AAE5F,SAAS,WAAW,SAAiB,GAAG;AAC7C,SAAO,OAAO,MAAM;AACtB;AAEO,SAAS,eAAe,YAAoB;AACjD,SAAQ,cAAc,WAAW,WAAW,SAAS,KAAK,WAAW,UAAU,GAAG,WAAW,MAAM,KAAM;AAC3G;AAKA,MAAM,UAA4B,CAAC,UAAU,WAAW,SAAS;AAE1D,SAAS,yBAAyB,UAAiC;AAIxE,UAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,uBAAmB,GAAG;AACtB,aAAS,GAAG;AAAA,EACd,CAAC;AAED,UAAQ,QAAQ,CAAC,WACf,QAAQ,KAAK,QAAQ,MAAM,SAAS,CAAC,CAAC;AAC1C;AAEO,SAAS,MACd,IACA,aAAqB,GACrB,iBAAwB,CAAC,GACzB,UAAkB,GAClB;AACA,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,OAAG,EACA,KAAK,OAAO,EACZ,MAAM,CAAC,MAAM;AACZ,UACE,eAAe,QAAQ,EAAE,WAAW,MAAM,MAC1C,YAAY,YACZ;AACA,mBAAW,MAAM;AACf,gBAAS,IAAI,YAAY,gBAAgB,OAAO,EAC9C,KAAK,OAAO,EACZ,MAAM,CAAC,OAAO,OAAO,EAAE,CAAC;AAAA,QAC5B,GAAG,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,GAAG,CAAC;AAAA,MAE3D,OAAO;AACL,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,CAAC;AACH;AAEO,SAAS,UAAU,KAAY,OAAwB;AAG5D,MAAI,UAAU,MAAM,SAAS,IAAI,QAAQ;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,IAAI,SAAS;AACzB,WAAS,IAAI,OAAO,IAAI,KAAK,KAAK;AAChC,QAAI,KAAK,IAAI,IAAI;AAAA,EACnB;AAEA,MAAI,SAAS;AACb,SAAO;AACT;AAEO,MAAM,SAAiB;AAAA,EAM5B,cAAc;AACZ,SAAK,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,WAAK,UAAU;AACf,WAAK,SAAS;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEO,KAAK,MAAyB;AACnC,WAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,SAAS,SAAS;AAAA,EACxD;AAAA,EAEO,MAAM,MAA2B;AACtC,WAAO,KAAK,QAAQ,MAAM,IAAI;AAAA,EAChC;AAEF;AAEO,SAAS,MAAM,MAAW,MAAkB;AACjD,WAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;AAC/C,UAAM,IAAI,KAAK;AACf,eAAW,OAAO,GAAG;AACnB,UAAI,EAAE,eAAe,GAAG,GAAG;AACzB,UAAE,OAAO,EAAE;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,MAAM,uBAAuB,aAAa;AAAC;AAIlD,aAAa;AAAA,EACX,OAAO;AAAA,EACP,MAAM;AAAA,EAEN,KAAK,OAAiB;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAoB;AACxB,WAAO,SAAS,OAAO;AAAA,EACzB;AACF,CAAC;",
6
6
  "names": []
7
7
  }