gamelet-cli 0.7.12 → 0.7.13

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 (49) hide show
  1. package/assets/package.json.twig +3 -3
  2. package/assets/tsconfig.json.twig +1 -1
  3. package/build/package.json +67 -67
  4. package/build/src/gamelet/download.js +773 -737
  5. package/build/src/gamelet/merges.js +181 -179
  6. package/build/src/gamelet/prepare.js +276 -277
  7. package/build/src/gamelet/upload.js +280 -279
  8. package/build/src/index.js +86 -86
  9. package/build/src/server/Constant.js +9 -9
  10. package/build/src/server/entities/Client.js +78 -78
  11. package/build/src/server/entities/ClientOwner.js +67 -67
  12. package/build/src/server/entities/ClientProject.js +84 -84
  13. package/build/src/server/entities/Gameroom.js +89 -89
  14. package/build/src/server/entities/GameroomBase.js +276 -276
  15. package/build/src/server/entities/Gamezone.js +73 -73
  16. package/build/src/server/entities/ListFilter.js +193 -193
  17. package/build/src/server/entities/Monitor.js +94 -94
  18. package/build/src/server/entities/Player.js +140 -140
  19. package/build/src/server/managers/ApiManager.js +75 -75
  20. package/build/src/server/managers/ClientManager.js +64 -64
  21. package/build/src/server/managers/Database.js +627 -627
  22. package/build/src/server/managers/GameroomManager.js +392 -392
  23. package/build/src/server/managers/ManagerBase.js +17 -17
  24. package/build/src/server/managers/MonitorManager.js +73 -73
  25. package/build/src/server/managers/PlayerManager.js +108 -108
  26. package/build/src/server/managers/SocketManager.js +60 -60
  27. package/build/src/server/managers/UserManager.js +58 -58
  28. package/build/src/server/messages/Message.js +143 -143
  29. package/build/src/server/server.js +112 -113
  30. package/build/src/server/services/ServiceBase.js +25 -25
  31. package/build/src/server/services/clientService.js +23 -23
  32. package/build/src/server/services/gameroomService.js +121 -121
  33. package/build/src/server/services/gltserver.service.js +23 -23
  34. package/build/src/server/services/playerService.js +32 -32
  35. package/build/src/server/startServer.js +32 -33
  36. package/build/src/server/types/BadgeStatus.js +25 -25
  37. package/build/src/server/types/OrderType.js +38 -38
  38. package/build/src/server/types/SubmitType.js +24 -24
  39. package/build/src/server/types/TimeRange.js +26 -26
  40. package/build/src/server/utils/ArrayUtil.js +126 -126
  41. package/build/src/server/utils/IntUtil.js +9 -9
  42. package/build/src/server/utils/ObjectUtil.js +191 -191
  43. package/build/src/server/utils/StringUtil.js +37 -37
  44. package/build/src/utils/cli.js +53 -53
  45. package/build/src/utils/file.js +350 -337
  46. package/build/src/utils/init.js +57 -42
  47. package/build/src/utils/log.js +18 -17
  48. package/build/src/utils/net.js +43 -39
  49. package/package.json +2 -2
@@ -1,276 +1,276 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GameroomBase = void 0;
4
- const Message_1 = require("../messages/Message");
5
- const ArrayUtil_1 = require("./../utils/ArrayUtil");
6
- const events_1 = require("events");
7
- const MonitorManager_1 = require("../managers/MonitorManager");
8
- class GameroomBase extends events_1.EventEmitter {
9
- constructor(roomType, code, server, client, stateJson) {
10
- super();
11
- this.roomType = roomType;
12
- this.code = code;
13
- this.server = server;
14
- this.client = client;
15
- this.stateJson = stateJson;
16
- this.players = [];
17
- // private states for each player, playerCode: object
18
- this.playerStates = {};
19
- this.createTime = Math.floor(Date.now() / 1000);
20
- this.stateJson = this.stateJson || {};
21
- }
22
- setFpsDirty() {
23
- this.ping = null;
24
- }
25
- getPing() {
26
- if (!this.ping) {
27
- if (this.players.length) {
28
- let min = 9999;
29
- let max = 0;
30
- let total = 0;
31
- for (let p of this.players) {
32
- min = Math.min(min, p.networkDelay);
33
- max = Math.max(max, p.networkDelay);
34
- total += p.networkDelay;
35
- }
36
- this.ping = {
37
- min: min,
38
- max: max,
39
- avg: Math.round(total / this.players.length),
40
- };
41
- }
42
- else {
43
- this.ping = {
44
- min: 0,
45
- max: 0,
46
- avg: 0,
47
- };
48
- }
49
- }
50
- return this.ping;
51
- }
52
- get monitorChannel() {
53
- return this.code;
54
- }
55
- dispose() {
56
- this.listPlayers().forEach(player => this.removePlayer(player));
57
- this.emit(GameroomBase.EVENT.DISPOSED);
58
- MonitorManager_1.monitorManager.log(this.client.project.code, this.monitorChannel, this.roomType + ' disposed', this.code);
59
- }
60
- setPlayerSynced(player, value, updateBrainer) {
61
- let promise;
62
- if (this.setPlayerState(player, 'synced', value, false)) {
63
- if (updateBrainer) {
64
- promise = this.updateBrainer(true);
65
- }
66
- }
67
- return (promise || Promise.resolve()).then(() => {
68
- this.emit(GameroomBase.EVENT.PLAYER_SYNCED_CHANGED, player, value, this.brainer.code);
69
- });
70
- }
71
- isPlayerSynced(player) {
72
- return !!this.getPlayerState(player, 'synced');
73
- }
74
- setPlayerState(player, key, value, emitEvent = true) {
75
- if (this.players.includes(player)) {
76
- let states = this.playerStates[player.code];
77
- if (!states) {
78
- this.playerStates[player.code] = states = {};
79
- }
80
- if (this._setPlayerState(states, key, value)) {
81
- emitEvent && this.emit(GameroomBase.EVENT.PLAYER_STATE_CHANGED, player, key, value);
82
- return true;
83
- }
84
- }
85
- else {
86
- throw new Error('Tried to set player state of a player who is not in this ' + this.roomType);
87
- }
88
- return false;
89
- }
90
- _setPlayerState(states, key, value) {
91
- if (states[key] !== value) {
92
- if (value === undefined || value === null) {
93
- value = null;
94
- delete states[key];
95
- }
96
- else {
97
- states[key] = value;
98
- }
99
- return true;
100
- }
101
- return false;
102
- }
103
- setPlayerStates(player, newStates) {
104
- if (this.players.includes(player)) {
105
- let result = false;
106
- if (newStates) {
107
- let states = this.playerStates[player.code];
108
- if (!states) {
109
- this.playerStates[player.code] = states = {};
110
- }
111
- for (let key in newStates) {
112
- if (this._setPlayerState(states, key, newStates[key])) {
113
- result = true;
114
- }
115
- }
116
- }
117
- else if (this.playerStates[player.code]) {
118
- result = true;
119
- this.deletePlayerState(player);
120
- }
121
- if (result) {
122
- this.emit(GameroomBase.EVENT.PLAYER_STATES_CHANGED, player, newStates);
123
- }
124
- }
125
- else {
126
- throw new Error('Tried to set player state of a player who is not in this ' + this.roomType);
127
- }
128
- return false;
129
- }
130
- getPlayer(code) {
131
- return this.players.find(p => p.code == code);
132
- }
133
- includesPlayer(player) {
134
- return this.players.includes(player);
135
- }
136
- getPlayerState(player, key) {
137
- let state = this.playerStates[player.code];
138
- return state && state[key];
139
- }
140
- getPlayerStates(player) {
141
- return this.playerStates[player.code];
142
- }
143
- deletePlayerState(player) {
144
- if (this.playerStates[player.code]) {
145
- delete this.playerStates[player.code];
146
- return true;
147
- }
148
- else {
149
- return false;
150
- }
151
- }
152
- listPlayers() {
153
- return this.players.slice();
154
- }
155
- getPlayersStates() {
156
- return this.playerStates;
157
- }
158
- get playersCount() {
159
- return this.players.length;
160
- }
161
- get socketChannel() {
162
- return this.code;
163
- }
164
- addPlayer(player) {
165
- if (ArrayUtil_1.ArrayUtil.addUniqueElement(this.players, player)) {
166
- this.setFpsDirty();
167
- if (!this.brainer) {
168
- this.updateBrainer(false);
169
- }
170
- player.socket.join(this.socketChannel);
171
- this.emit(GameroomBase.EVENT.PLAYER_ADDED, player);
172
- this.emit(GameroomBase.EVENT.STATUS_CHANGED);
173
- return true;
174
- }
175
- return false;
176
- }
177
- removePlayer(player) {
178
- if (ArrayUtil_1.ArrayUtil.removeElement(this.players, player)) {
179
- this.setFpsDirty();
180
- player.socket.leave(this.socketChannel);
181
- if (this.deletePlayerState(player)) {
182
- this.emit(GameroomBase.EVENT.PLAYER_STATES_CHANGED, player, null);
183
- }
184
- if (player == this.brainer) {
185
- // must do this before we send playerLeft event
186
- this.updateBrainer(false);
187
- }
188
- this.emit(GameroomBase.EVENT.STATUS_CHANGED);
189
- this.emit(GameroomBase.EVENT.PLAYER_REMOVED, player);
190
- return true;
191
- }
192
- return false;
193
- }
194
- setBrainerByPlayer(playerCode, needPreset) {
195
- let brainer = this.players.find(p => p.code == playerCode);
196
- if (!brainer) {
197
- throw new Error('The player is not in room.');
198
- }
199
- return this._setBrainer(brainer, needPreset);
200
- }
201
- updateBrainer(needPreset) {
202
- return this._setBrainer(this.chooseBrainer(), needPreset);
203
- }
204
- _setBrainer(brainer, needPreset) {
205
- if (brainer != this.brainer) {
206
- if (needPreset) {
207
- return brainer.send(Message_1.Message.forRoomBrainerSet(this.code))
208
- .then(() => {
209
- this.brainer = brainer;
210
- this.emit(GameroomBase.EVENT.BRAINER_CHANGED);
211
- return this.brainer;
212
- });
213
- }
214
- else {
215
- this.brainer = brainer;
216
- this.emit(GameroomBase.EVENT.BRAINER_CHANGED);
217
- }
218
- }
219
- return Promise.resolve(this.brainer);
220
- }
221
- chooseBrainer() {
222
- if (this.players.length) {
223
- let idleStart = Date.now() - 10000;
224
- let brainer = this.players[0];
225
- let bestDelay = this.calcNetworkDelayValue(brainer, idleStart);
226
- for (let i = this.players.length - 1; i > 0; --i) {
227
- let player = this.players[i];
228
- if (this.isPlayerSynced(player)) {
229
- let delay = this.calcNetworkDelayValue(player, idleStart);
230
- if (player.cheats) {
231
- delay += 500;
232
- }
233
- if (delay < bestDelay) {
234
- brainer = player;
235
- bestDelay = delay;
236
- }
237
- }
238
- }
239
- return brainer;
240
- }
241
- return null;
242
- }
243
- /**
244
- * network delay + idle factor
245
- */
246
- calcNetworkDelayValue(player, idleStart) {
247
- let value = player.networkDelay;
248
- if (idleStart > player.lastMsgTime) {
249
- value += (idleStart - player.lastMsgTime) / 100;
250
- }
251
- return value;
252
- }
253
- getBrainer() {
254
- return this.brainer;
255
- }
256
- broadcast(msg) {
257
- MonitorManager_1.monitorManager.logOutgoing(this.client.project.code, this.monitorChannel, this.roomType + '.broadcast', [this.code, msg.type, msg.params]);
258
- msg.send(this.server.to(this.socketChannel));
259
- }
260
- broadcastByPlayer(msg, sender) {
261
- MonitorManager_1.monitorManager.logIncoming(this.client.project.code, this.monitorChannel, this.roomType + '.broadcast', [this.code, msg.type, msg.params], sender);
262
- msg.send(this.server.to(this.socketChannel));
263
- }
264
- }
265
- exports.GameroomBase = GameroomBase;
266
- GameroomBase.EVENT = {
267
- DISPOSED: 'disposed',
268
- PLAYER_ADDED: 'playerAdded',
269
- PLAYER_REMOVED: 'playerRemoved',
270
- BRAINER_CHANGED: 'brainerChanged',
271
- STATUS_CHANGED: 'statusChanged',
272
- PLAYER_STATE_CHANGED: 'playerStateChanged',
273
- PLAYER_STATES_CHANGED: 'playerStatesChanged',
274
- PLAYER_SYNCED_CHANGED: 'playerSyncedChanged',
275
- };
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJvb21CYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9HYW1lcm9vbUJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQThDO0FBQzlDLG9EQUFpRDtBQUVqRCxtQ0FBc0M7QUFDdEMsK0RBQTREO0FBRTVELE1BQWEsWUFBYSxTQUFRLHFCQUFZO0lBd0IxQyxZQUFtQixRQUFnQixFQUN4QixJQUFZLEVBQ1gsTUFBMEIsRUFDM0IsTUFBYyxFQUNkLFNBQWtDO1FBRXpDLEtBQUssRUFBRSxDQUFDO1FBTk8sYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1gsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQXlCO1FBYm5DLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFJakMscURBQXFEO1FBQzNDLGlCQUFZLEdBQThDLEVBQUUsQ0FBQztRQUVoRSxlQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFTdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7Z0JBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZCxLQUFLLElBQUksQ0FBQyxJ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
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GameroomBase = void 0;
4
+ const Message_1 = require("../messages/Message");
5
+ const ArrayUtil_1 = require("./../utils/ArrayUtil");
6
+ const events_1 = require("events");
7
+ const MonitorManager_1 = require("../managers/MonitorManager");
8
+ class GameroomBase extends events_1.EventEmitter {
9
+ constructor(roomType, code, server, client, stateJson) {
10
+ super();
11
+ this.roomType = roomType;
12
+ this.code = code;
13
+ this.server = server;
14
+ this.client = client;
15
+ this.stateJson = stateJson;
16
+ this.players = [];
17
+ // private states for each player, playerCode: object
18
+ this.playerStates = {};
19
+ this.createTime = Math.floor(Date.now() / 1000);
20
+ this.stateJson = this.stateJson || {};
21
+ }
22
+ setFpsDirty() {
23
+ this.ping = null;
24
+ }
25
+ getPing() {
26
+ if (!this.ping) {
27
+ if (this.players.length) {
28
+ let min = 9999;
29
+ let max = 0;
30
+ let total = 0;
31
+ for (let p of this.players) {
32
+ min = Math.min(min, p.networkDelay);
33
+ max = Math.max(max, p.networkDelay);
34
+ total += p.networkDelay;
35
+ }
36
+ this.ping = {
37
+ min: min,
38
+ max: max,
39
+ avg: Math.round(total / this.players.length),
40
+ };
41
+ }
42
+ else {
43
+ this.ping = {
44
+ min: 0,
45
+ max: 0,
46
+ avg: 0,
47
+ };
48
+ }
49
+ }
50
+ return this.ping;
51
+ }
52
+ get monitorChannel() {
53
+ return this.code;
54
+ }
55
+ dispose() {
56
+ this.listPlayers().forEach(player => this.removePlayer(player));
57
+ this.emit(GameroomBase.EVENT.DISPOSED);
58
+ MonitorManager_1.monitorManager.log(this.client.project.code, this.monitorChannel, this.roomType + ' disposed', this.code);
59
+ }
60
+ setPlayerSynced(player, value, updateBrainer) {
61
+ let promise;
62
+ if (this.setPlayerState(player, 'synced', value, false)) {
63
+ if (updateBrainer) {
64
+ promise = this.updateBrainer(true);
65
+ }
66
+ }
67
+ return (promise || Promise.resolve()).then(() => {
68
+ this.emit(GameroomBase.EVENT.PLAYER_SYNCED_CHANGED, player, value, this.brainer.code);
69
+ });
70
+ }
71
+ isPlayerSynced(player) {
72
+ return !!this.getPlayerState(player, 'synced');
73
+ }
74
+ setPlayerState(player, key, value, emitEvent = true) {
75
+ if (this.players.includes(player)) {
76
+ let states = this.playerStates[player.code];
77
+ if (!states) {
78
+ this.playerStates[player.code] = states = {};
79
+ }
80
+ if (this._setPlayerState(states, key, value)) {
81
+ emitEvent && this.emit(GameroomBase.EVENT.PLAYER_STATE_CHANGED, player, key, value);
82
+ return true;
83
+ }
84
+ }
85
+ else {
86
+ throw new Error('Tried to set player state of a player who is not in this ' + this.roomType);
87
+ }
88
+ return false;
89
+ }
90
+ _setPlayerState(states, key, value) {
91
+ if (states[key] !== value) {
92
+ if (value === undefined || value === null) {
93
+ value = null;
94
+ delete states[key];
95
+ }
96
+ else {
97
+ states[key] = value;
98
+ }
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+ setPlayerStates(player, newStates) {
104
+ if (this.players.includes(player)) {
105
+ let result = false;
106
+ if (newStates) {
107
+ let states = this.playerStates[player.code];
108
+ if (!states) {
109
+ this.playerStates[player.code] = states = {};
110
+ }
111
+ for (let key in newStates) {
112
+ if (this._setPlayerState(states, key, newStates[key])) {
113
+ result = true;
114
+ }
115
+ }
116
+ }
117
+ else if (this.playerStates[player.code]) {
118
+ result = true;
119
+ this.deletePlayerState(player);
120
+ }
121
+ if (result) {
122
+ this.emit(GameroomBase.EVENT.PLAYER_STATES_CHANGED, player, newStates);
123
+ }
124
+ }
125
+ else {
126
+ throw new Error('Tried to set player state of a player who is not in this ' + this.roomType);
127
+ }
128
+ return false;
129
+ }
130
+ getPlayer(code) {
131
+ return this.players.find(p => p.code == code);
132
+ }
133
+ includesPlayer(player) {
134
+ return this.players.includes(player);
135
+ }
136
+ getPlayerState(player, key) {
137
+ let state = this.playerStates[player.code];
138
+ return state && state[key];
139
+ }
140
+ getPlayerStates(player) {
141
+ return this.playerStates[player.code];
142
+ }
143
+ deletePlayerState(player) {
144
+ if (this.playerStates[player.code]) {
145
+ delete this.playerStates[player.code];
146
+ return true;
147
+ }
148
+ else {
149
+ return false;
150
+ }
151
+ }
152
+ listPlayers() {
153
+ return this.players.slice();
154
+ }
155
+ getPlayersStates() {
156
+ return this.playerStates;
157
+ }
158
+ get playersCount() {
159
+ return this.players.length;
160
+ }
161
+ get socketChannel() {
162
+ return this.code;
163
+ }
164
+ addPlayer(player) {
165
+ if (ArrayUtil_1.ArrayUtil.addUniqueElement(this.players, player)) {
166
+ this.setFpsDirty();
167
+ if (!this.brainer) {
168
+ this.updateBrainer(false);
169
+ }
170
+ player.socket.join(this.socketChannel);
171
+ this.emit(GameroomBase.EVENT.PLAYER_ADDED, player);
172
+ this.emit(GameroomBase.EVENT.STATUS_CHANGED);
173
+ return true;
174
+ }
175
+ return false;
176
+ }
177
+ removePlayer(player) {
178
+ if (ArrayUtil_1.ArrayUtil.removeElement(this.players, player)) {
179
+ this.setFpsDirty();
180
+ player.socket.leave(this.socketChannel);
181
+ if (this.deletePlayerState(player)) {
182
+ this.emit(GameroomBase.EVENT.PLAYER_STATES_CHANGED, player, null);
183
+ }
184
+ if (player == this.brainer) {
185
+ // must do this before we send playerLeft event
186
+ this.updateBrainer(false);
187
+ }
188
+ this.emit(GameroomBase.EVENT.STATUS_CHANGED);
189
+ this.emit(GameroomBase.EVENT.PLAYER_REMOVED, player);
190
+ return true;
191
+ }
192
+ return false;
193
+ }
194
+ setBrainerByPlayer(playerCode, needPreset) {
195
+ let brainer = this.players.find(p => p.code == playerCode);
196
+ if (!brainer) {
197
+ throw new Error('The player is not in room.');
198
+ }
199
+ return this._setBrainer(brainer, needPreset);
200
+ }
201
+ updateBrainer(needPreset) {
202
+ return this._setBrainer(this.chooseBrainer(), needPreset);
203
+ }
204
+ _setBrainer(brainer, needPreset) {
205
+ if (brainer != this.brainer) {
206
+ if (needPreset) {
207
+ return brainer.send(Message_1.Message.forRoomBrainerSet(this.code))
208
+ .then(() => {
209
+ this.brainer = brainer;
210
+ this.emit(GameroomBase.EVENT.BRAINER_CHANGED);
211
+ return this.brainer;
212
+ });
213
+ }
214
+ else {
215
+ this.brainer = brainer;
216
+ this.emit(GameroomBase.EVENT.BRAINER_CHANGED);
217
+ }
218
+ }
219
+ return Promise.resolve(this.brainer);
220
+ }
221
+ chooseBrainer() {
222
+ if (this.players.length) {
223
+ let idleStart = Date.now() - 10000;
224
+ let brainer = this.players[0];
225
+ let bestDelay = this.calcNetworkDelayValue(brainer, idleStart);
226
+ for (let i = this.players.length - 1; i > 0; --i) {
227
+ let player = this.players[i];
228
+ if (this.isPlayerSynced(player)) {
229
+ let delay = this.calcNetworkDelayValue(player, idleStart);
230
+ if (player.cheats) {
231
+ delay += 500;
232
+ }
233
+ if (delay < bestDelay) {
234
+ brainer = player;
235
+ bestDelay = delay;
236
+ }
237
+ }
238
+ }
239
+ return brainer;
240
+ }
241
+ return null;
242
+ }
243
+ /**
244
+ * network delay + idle factor
245
+ */
246
+ calcNetworkDelayValue(player, idleStart) {
247
+ let value = player.networkDelay;
248
+ if (idleStart > player.lastMsgTime) {
249
+ value += (idleStart - player.lastMsgTime) / 100;
250
+ }
251
+ return value;
252
+ }
253
+ getBrainer() {
254
+ return this.brainer;
255
+ }
256
+ broadcast(msg) {
257
+ MonitorManager_1.monitorManager.logOutgoing(this.client.project.code, this.monitorChannel, this.roomType + '.broadcast', [this.code, msg.type, msg.params]);
258
+ msg.send(this.server.to(this.socketChannel));
259
+ }
260
+ broadcastByPlayer(msg, sender) {
261
+ MonitorManager_1.monitorManager.logIncoming(this.client.project.code, this.monitorChannel, this.roomType + '.broadcast', [this.code, msg.type, msg.params], sender);
262
+ msg.send(this.server.to(this.socketChannel));
263
+ }
264
+ }
265
+ exports.GameroomBase = GameroomBase;
266
+ GameroomBase.EVENT = {
267
+ DISPOSED: 'disposed',
268
+ PLAYER_ADDED: 'playerAdded',
269
+ PLAYER_REMOVED: 'playerRemoved',
270
+ BRAINER_CHANGED: 'brainerChanged',
271
+ STATUS_CHANGED: 'statusChanged',
272
+ PLAYER_STATE_CHANGED: 'playerStateChanged',
273
+ PLAYER_STATES_CHANGED: 'playerStatesChanged',
274
+ PLAYER_SYNCED_CHANGED: 'playerSyncedChanged',
275
+ };
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZXJvb21CYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9HYW1lcm9vbUJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQThDO0FBQzlDLG9EQUFpRDtBQUVqRCxtQ0FBc0M7QUFDdEMsK0RBQTREO0FBRTVELE1BQWEsWUFBYSxTQUFRLHFCQUFZO0lBd0IxQyxZQUFtQixRQUFnQixFQUN4QixJQUFZLEVBQ1gsTUFBMEIsRUFDM0IsTUFBYyxFQUNkLFNBQWtDO1FBRXpDLEtBQUssRUFBRSxDQUFDO1FBTk8sYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1gsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGNBQVMsR0FBVCxTQUFTLENBQXlCO1FBYm5DLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFJakMscURBQXFEO1FBQzNDLGlCQUFZLEdBQThDLEVBQUUsQ0FBQztRQUVoRSxlQUFVLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFTdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO2dCQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDWixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2QsS0FBSyxJ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