trucoshi 0.0.17 → 0.0.18

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.
@@ -17,7 +17,7 @@ function Team(players) {
17
17
  },
18
18
  disable: function (player) {
19
19
  var _a;
20
- (_a = team._players.get(player.id)) === null || _a === void 0 ? void 0 : _a.disable();
20
+ (_a = team._players.get(player.session)) === null || _a === void 0 ? void 0 : _a.disable();
21
21
  return team.isTeamDisabled();
22
22
  },
23
23
  addPoints: function (matchPoint, points) {
@@ -36,7 +36,7 @@ function Team(players) {
36
36
  return team.points;
37
37
  },
38
38
  };
39
- players.forEach(function (player) { return team._players.set(player.id, player); });
39
+ players.forEach(function (player) { return team._players.set(player.session, player); });
40
40
  return team;
41
41
  }
42
42
  exports.Team = Team;
@@ -41,9 +41,10 @@ export declare const CARDS: {
41
41
  "4b": number;
42
42
  "4c": number;
43
43
  };
44
- export declare const COLORS: string[];
45
44
  export declare const TEAM_SIZE_VALUES: number[];
46
45
  export declare enum GAME_ERROR {
46
+ MATCH_ALREADY_STARTED = "MATCH_ALREADY_STARTED",
47
+ LOBBY_IS_FULL = "LOBBY_IS_FULL",
47
48
  UNEXPECTED_TEAM_SIZE = "UNEXPECTED_TEAM_SIZE",
48
49
  TEAM_NOT_READY = "TEAM_NOT_READY",
49
50
  TEAM_IS_FULL = "TEAM_IS_FULL"
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.EnvidoCalculator = exports.GAME_ERROR = exports.TEAM_SIZE_VALUES = exports.COLORS = exports.CARDS = void 0;
4
+ exports.EnvidoCalculator = exports.GAME_ERROR = exports.TEAM_SIZE_VALUES = exports.CARDS = void 0;
5
5
  var types_1 = require("./types");
6
6
  var utils_1 = require("./utils");
7
7
  exports.CARDS = {
@@ -46,19 +46,11 @@ exports.CARDS = {
46
46
  "4b": 0,
47
47
  "4c": 0,
48
48
  };
49
- exports.COLORS = [
50
- "#9b111",
51
- "#17c6c6",
52
- "#8c1d1d",
53
- "#9f9b9b",
54
- "#a5a5a5",
55
- "#f5a623",
56
- "#f44336",
57
- "#c2185b",
58
- ];
59
49
  exports.TEAM_SIZE_VALUES = [1, 2, 3];
60
50
  var GAME_ERROR;
61
51
  (function (GAME_ERROR) {
52
+ GAME_ERROR["MATCH_ALREADY_STARTED"] = "MATCH_ALREADY_STARTED";
53
+ GAME_ERROR["LOBBY_IS_FULL"] = "LOBBY_IS_FULL";
62
54
  GAME_ERROR["UNEXPECTED_TEAM_SIZE"] = "UNEXPECTED_TEAM_SIZE";
63
55
  GAME_ERROR["TEAM_NOT_READY"] = "TEAM_NOT_READY";
64
56
  GAME_ERROR["TEAM_IS_FULL"] = "TEAM_IS_FULL";
@@ -8,6 +8,7 @@ export interface IGameLoop {
8
8
  _onWinner: IWinnerCallback;
9
9
  teams: Array<ITeam>;
10
10
  hands: Array<IHand>;
11
+ winner: ITeam | null;
11
12
  onTurn: (callback: ITurnCallback) => IGameLoop;
12
13
  onWinner: (callback: IWinnerCallback) => IGameLoop;
13
14
  onTruco: (callback: ITrucoCallback) => IGameLoop;
package/dist/lib/index.js CHANGED
@@ -49,6 +49,7 @@ var GameLoop = function (match) {
49
49
  _onTurn: function () { return Promise.resolve(); },
50
50
  _onWinner: function () { return Promise.resolve(); },
51
51
  teams: [],
52
+ winner: null,
52
53
  hands: [],
53
54
  onTruco: function (callback) {
54
55
  gameloop._onTruco = callback;
@@ -89,7 +90,9 @@ var GameLoop = function (match) {
89
90
  _a.sent();
90
91
  return [3 /*break*/, 1];
91
92
  case 5: return [3 /*break*/, 1];
92
- case 6: return [4 /*yield*/, gameloop._onWinner(match.winner, match.teams)];
93
+ case 6:
94
+ gameloop.winner = match.winner;
95
+ return [4 /*yield*/, gameloop._onWinner(match.winner, match.teams)];
93
96
  case 7:
94
97
  _a.sent();
95
98
  return [2 /*return*/];
@@ -103,66 +106,104 @@ var GameLoop = function (match) {
103
106
  function Lobby(teamSize) {
104
107
  var lobby = {
105
108
  lastTeamIdx: 1,
106
- _players: new Map(),
109
+ _players: [],
107
110
  get players() {
108
- return Array.from(lobby._players.values());
111
+ return lobby._players.filter(function (player) { return Boolean(player && player.id); });
109
112
  },
110
113
  teams: [],
111
114
  table: null,
112
115
  maxPlayers: teamSize ? teamSize * 2 : 6,
113
116
  full: false,
114
117
  ready: false,
118
+ started: false,
115
119
  gameLoop: undefined,
116
120
  calculateReady: function () {
117
- lobby.ready = lobby.players.reduce(function (prev, curr) { return prev && curr.ready; }, true);
121
+ var allPlayersReady = lobby.players.reduce(function (prev, curr) { return Boolean(prev && curr && curr.ready); }, true);
122
+ var teamsSameSize = lobby.players.filter(function (player) { return player.teamIdx === 0; }).length ===
123
+ lobby.players.filter(function (player) { return player.teamIdx === 1; }).length;
124
+ var allTeamsComplete = lobby.players.length % 2 === 0;
125
+ lobby.ready = allPlayersReady && allTeamsComplete && teamsSameSize;
118
126
  return lobby.ready;
119
127
  },
120
128
  calculateFull: function () {
121
- lobby.full = lobby._players.size >= lobby.maxPlayers;
129
+ lobby.full = lobby.players.length >= lobby.maxPlayers;
122
130
  return lobby.full;
123
131
  },
124
132
  addPlayer: function (id, session, teamIdx) {
133
+ var exists = lobby.players.find(function (player) { return player.session === session; });
134
+ if (exists) {
135
+ if (exists.teamIdx === teamIdx) {
136
+ return exists;
137
+ }
138
+ console.log({ session: session, ex: exists.session });
139
+ lobby.removePlayer(exists.session);
140
+ }
141
+ if (lobby.started) {
142
+ throw new Error(constants_1.GAME_ERROR.MATCH_ALREADY_STARTED);
143
+ }
144
+ if (lobby.full) {
145
+ throw new Error(constants_1.GAME_ERROR.LOBBY_IS_FULL);
146
+ }
125
147
  var maxSize = teamSize ? teamSize : 3;
126
- if (lobby.full || lobby.players.filter(function (p) { return p.teamIdx === teamIdx; }).length > maxSize) {
148
+ if (lobby.full ||
149
+ lobby.players.filter(function (player) { return player.teamIdx === teamIdx; }).length > maxSize) {
127
150
  throw new Error(constants_1.GAME_ERROR.TEAM_IS_FULL);
128
151
  }
129
152
  var player = (0, Player_1.Player)(id, teamIdx !== undefined ? teamIdx : Number(!lobby.lastTeamIdx));
130
153
  player.setSession(session);
131
154
  lobby.lastTeamIdx = Number(!lobby.lastTeamIdx);
132
- lobby._players.set(id, player);
155
+ for (var i = 0; i < lobby._players.length; i++) {
156
+ if (!lobby._players[i].id) {
157
+ if (player.teamIdx === 0 && i % 2 === 0) {
158
+ lobby._players[i] = player;
159
+ break;
160
+ }
161
+ if (player.teamIdx === 1 && i % 2 !== 0) {
162
+ lobby._players[i] = player;
163
+ break;
164
+ }
165
+ }
166
+ }
133
167
  lobby.calculateFull();
134
168
  lobby.calculateReady();
135
169
  return player;
136
170
  },
137
- removePlayer: function (id) {
138
- lobby._players.delete(id);
139
- lobby.calculateFull();
140
- lobby.calculateReady();
171
+ removePlayer: function (session) {
172
+ var idx = lobby._players.findIndex(function (player) { return player && player.session === session; });
173
+ if (idx !== -1) {
174
+ lobby._players[idx] = {};
175
+ lobby.calculateFull();
176
+ lobby.calculateReady();
177
+ }
141
178
  return lobby;
142
179
  },
143
180
  startMatch: function (matchPoint) {
144
181
  if (matchPoint === void 0) { matchPoint = 9; }
145
182
  lobby.calculateReady();
146
- var teamSize = lobby._players.size / 2;
147
- if (!constants_1.TEAM_SIZE_VALUES.includes(teamSize)) {
183
+ var actualTeamSize = lobby.players.length / 2;
184
+ if (!constants_1.TEAM_SIZE_VALUES.includes(actualTeamSize)) {
148
185
  throw new Error(constants_1.GAME_ERROR.UNEXPECTED_TEAM_SIZE);
149
186
  }
150
187
  if (!lobby.ready) {
151
188
  throw new Error(constants_1.GAME_ERROR.TEAM_NOT_READY);
152
189
  }
153
190
  lobby.teams = [
154
- (0, Team_1.Team)(lobby.players.filter(function (p) { return p.teamIdx === 0; })),
155
- (0, Team_1.Team)(lobby.players.filter(function (p) { return p.teamIdx === 1; })),
191
+ (0, Team_1.Team)(lobby.players.filter(function (player) { return player.teamIdx === 0; })),
192
+ (0, Team_1.Team)(lobby.players.filter(function (player) { return player.teamIdx === 1; })),
156
193
  ];
157
- if (lobby.teams[0].players.length !== teamSize ||
158
- lobby.teams[1].players.length !== teamSize) {
194
+ if (lobby.teams[0].players.length !== actualTeamSize ||
195
+ lobby.teams[1].players.length !== actualTeamSize) {
159
196
  throw new Error(constants_1.GAME_ERROR.UNEXPECTED_TEAM_SIZE);
160
197
  }
161
198
  lobby.table = (0, Table_1.Table)(lobby.players, lobby.teams);
162
199
  lobby.gameLoop = GameLoop((0, Match_1.Match)(lobby.table, lobby.teams, matchPoint));
200
+ lobby.started = true;
163
201
  return lobby.gameLoop;
164
202
  },
165
203
  };
204
+ for (var i = 0; i < lobby.maxPlayers; i++) {
205
+ lobby._players.push({});
206
+ }
166
207
  return lobby;
167
208
  }
168
209
  exports.Lobby = Lobby;
@@ -151,20 +151,24 @@ export interface IHand {
151
151
  export interface IPrivateLobby {
152
152
  gameLoop?: IGameLoop;
153
153
  lastTeamIdx: 0 | 1;
154
- _players: Map<string, IPlayer>;
154
+ _players: Array<IPlayer | {
155
+ id?: undefined;
156
+ session?: undefined;
157
+ }>;
155
158
  get players(): Array<IPlayer>;
156
159
  teams: Array<ITeam>;
157
160
  maxPlayers: number;
158
161
  table: ITable | null;
159
- ready: boolean;
160
162
  full: boolean;
163
+ ready: boolean;
164
+ started: boolean;
161
165
  addPlayer(id: string, session: string, teamIdx?: 0 | 1): IPlayer;
162
166
  removePlayer(id: string): ILobby;
163
167
  calculateReady(): boolean;
164
168
  calculateFull(): boolean;
165
169
  startMatch(matchPoint?: 9 | 12 | 15): IGameLoop;
166
170
  }
167
- export interface ILobby extends Pick<IPrivateLobby, "addPlayer" | "removePlayer" | "startMatch" | "ready" | "full" | "teams" | "players" | "gameLoop" | "table"> {
171
+ export interface ILobby extends Pick<IPrivateLobby, "addPlayer" | "removePlayer" | "startMatch" | "ready" | "full" | "started" | "teams" | "players" | "gameLoop" | "table" | "calculateReady"> {
168
172
  }
169
173
  export interface ITable {
170
174
  forehandIdx: number;
@@ -1,26 +1,29 @@
1
1
  import { IPublicPlayer } from "../../lib/classes/Player";
2
2
  import { IPublicTeam } from "../../lib/classes/Team";
3
- import { ILobby, IPlayedCard } from "../../lib/types";
3
+ import { ILobby, IPlayedCard, ITeam } from "../../lib/types";
4
4
  export interface IPublicMatch {
5
+ winner: ITeam | null;
5
6
  matchSessionId: string;
6
7
  teams: Array<IPublicTeam>;
7
8
  players: Array<IPublicPlayer>;
9
+ me: IPublicPlayer;
8
10
  rounds: IPlayedCard[][];
11
+ prevRounds: IPlayedCard[][] | null;
9
12
  state: EMatchTableState;
10
13
  }
11
14
  export interface IMatchTable {
12
15
  matchSessionId: string;
13
16
  currentPlayer: IPublicPlayer | null;
14
17
  lobby: ILobby;
15
- state: EMatchTableState;
16
- setState(state: EMatchTableState): void;
18
+ state(): EMatchTableState;
17
19
  setCurrentPlayer(player: IPublicPlayer): void;
18
20
  isSessionPlaying(session: string): IPublicPlayer | null;
19
21
  getPublicMatch(session?: string): IPublicMatch;
20
22
  }
21
23
  export declare enum EMatchTableState {
22
24
  UNREADY = 0,
23
- STARTED = 1,
24
- FINISHED = 2
25
+ READY = 1,
26
+ STARTED = 2,
27
+ FINISHED = 3
25
28
  }
26
29
  export declare function MatchTable(matchSessionId: string, teamSize?: 1 | 2 | 3): IMatchTable;
@@ -16,41 +16,66 @@ var lib_1 = require("../../lib");
16
16
  var EMatchTableState;
17
17
  (function (EMatchTableState) {
18
18
  EMatchTableState[EMatchTableState["UNREADY"] = 0] = "UNREADY";
19
- EMatchTableState[EMatchTableState["STARTED"] = 1] = "STARTED";
20
- EMatchTableState[EMatchTableState["FINISHED"] = 2] = "FINISHED";
19
+ EMatchTableState[EMatchTableState["READY"] = 1] = "READY";
20
+ EMatchTableState[EMatchTableState["STARTED"] = 2] = "STARTED";
21
+ EMatchTableState[EMatchTableState["FINISHED"] = 3] = "FINISHED";
21
22
  })(EMatchTableState = exports.EMatchTableState || (exports.EMatchTableState = {}));
22
23
  function MatchTable(matchSessionId, teamSize) {
23
24
  var matchTable = {
24
25
  matchSessionId: matchSessionId,
25
26
  currentPlayer: null,
26
27
  lobby: (0, lib_1.Lobby)(teamSize),
27
- state: EMatchTableState.UNREADY,
28
- setState: function (state) {
29
- matchTable.state = state;
28
+ state: function () {
29
+ var _a;
30
+ matchTable.lobby.calculateReady();
31
+ if ((_a = matchTable.lobby.gameLoop) === null || _a === void 0 ? void 0 : _a.winner) {
32
+ return EMatchTableState.FINISHED;
33
+ }
34
+ if (matchTable.lobby.started) {
35
+ return EMatchTableState.STARTED;
36
+ }
37
+ if (matchTable.lobby.ready) {
38
+ return EMatchTableState.READY;
39
+ }
40
+ return EMatchTableState.UNREADY;
30
41
  },
31
42
  setCurrentPlayer: function (player) {
32
43
  matchTable.currentPlayer = player;
33
44
  },
34
45
  isSessionPlaying: function (session) {
35
46
  var lobby = matchTable.lobby;
36
- var search = lobby.players.find(function (player) { return player.session === session; });
47
+ var search = lobby.players.find(function (player) { return player && player.session === session; });
37
48
  return search || null;
38
49
  },
39
50
  getPublicMatch: function (userSession) {
40
- var _a, _b, _c;
51
+ var _a, _b, _c, _d, _e, _f;
41
52
  var lobby = matchTable.lobby;
42
- var lastHand = (((_a = lobby.gameLoop) === null || _a === void 0 ? void 0 : _a.hands.length) || 1) - 1;
43
- var rounds = (_c = (_b = lobby.gameLoop) === null || _b === void 0 ? void 0 : _b.hands[lastHand]) === null || _c === void 0 ? void 0 : _c.rounds.map(function (round) { return round.cards; });
53
+ var winner = ((_a = lobby.gameLoop) === null || _a === void 0 ? void 0 : _a.winner) || null;
54
+ var lastHandIdx = (((_b = lobby.gameLoop) === null || _b === void 0 ? void 0 : _b.hands.length) || 1) - 1;
55
+ var rounds = (_d = (_c = lobby.gameLoop) === null || _c === void 0 ? void 0 : _c.hands[lastHandIdx]) === null || _d === void 0 ? void 0 : _d.rounds.map(function (round) { return round.cards; });
56
+ var prevHandIdx = lastHandIdx - 1;
57
+ var prevRounds = prevHandIdx !== -1
58
+ ? (_f = (_e = lobby.gameLoop) === null || _e === void 0 ? void 0 : _e.hands[prevHandIdx]) === null || _f === void 0 ? void 0 : _f.rounds.map(function (round) { return round.cards; })
59
+ : null;
60
+ var players = lobby.players.filter(function (player) { return Boolean(player); });
61
+ var currentPlayerIdx = players.findIndex(function (player) { return player && player.session === userSession; });
62
+ var me = players[currentPlayerIdx];
63
+ var cut = players.slice(currentPlayerIdx, players.length);
64
+ var end = players.slice(0, currentPlayerIdx);
65
+ var publicPlayers = cut.concat(end).map(function (player) {
66
+ return (player === null || player === void 0 ? void 0 : player.session) === userSession
67
+ ? player
68
+ : __assign(__assign({}, player), { session: undefined, hand: player === null || player === void 0 ? void 0 : player.hand.map(function () { return "xx"; }) });
69
+ });
44
70
  return {
71
+ me: me,
72
+ winner: winner,
45
73
  matchSessionId: matchTable.matchSessionId,
46
- state: matchTable.state,
74
+ state: matchTable.state(),
47
75
  teams: [],
48
- players: lobby.players.map(function (player) {
49
- return player.session === userSession
50
- ? player
51
- : __assign(__assign({}, player), { hand: player.hand.map(function () { return "xx"; }) });
52
- }),
76
+ players: publicPlayers,
53
77
  rounds: rounds || [[]],
78
+ prevRounds: prevRounds || null,
54
79
  };
55
80
  },
56
81
  };
@@ -53,11 +53,12 @@ var socket_io_1 = require("socket.io");
53
53
  var MatchTable_1 = require("./classes/MatchTable");
54
54
  var User_1 = require("./classes/User");
55
55
  var types_1 = require("./types");
56
- var PORT = 4001;
56
+ var PORT = process.env.NODE_PORT || 4001;
57
+ var ORIGIN = process.env.NODE_ORIGIN || "http://localhost:3000";
57
58
  var httpServer = (0, http_1.createServer)();
58
59
  var io = new socket_io_1.Server(httpServer, {
59
60
  cors: {
60
- origin: "http://localhost:3000",
61
+ origin: ORIGIN,
61
62
  methods: ["GET", "POST"],
62
63
  },
63
64
  });
@@ -114,8 +115,19 @@ io.on("connection", function (_socket) {
114
115
  return __generator(this, function (_a) {
115
116
  switch (_a.label) {
116
117
  case 0: return [4 /*yield*/, getTableSockets(table, function (playerSocket) { return __awaiter(void 0, void 0, void 0, function () {
118
+ var tmp, save;
117
119
  return __generator(this, function (_a) {
118
- playerSocket.emit(types_1.EServerEvent.UPDATE_MATCH, table.getPublicMatch(playerSocket.session));
120
+ tmp = table.getPublicMatch(playerSocket.session);
121
+ save = function () { return playerSocket.emit(types_1.EServerEvent.UPDATE_MATCH, tmp); };
122
+ // if (tmp.prevRounds && tmp.rounds[0].length === 0) {
123
+ // playerSocket.emit(EServerEvent.UPDATE_MATCH, {
124
+ // ...tmp,
125
+ // rounds: tmp.prevRounds,
126
+ // })
127
+ // setTimeout(save, 4500)
128
+ // return
129
+ // }
130
+ save();
119
131
  return [2 /*return*/];
120
132
  });
121
133
  }); })];
@@ -143,7 +155,7 @@ io.on("connection", function (_socket) {
143
155
  });
144
156
  }
145
157
  var table = (0, MatchTable_1.MatchTable)(socket.session);
146
- table.lobby.addPlayer(user.id, socket.session);
158
+ table.lobby.addPlayer(user.id, socket.session, 0);
147
159
  socket.join(socket.session);
148
160
  addSocketToUser(socket.session, socket.id, table);
149
161
  tables.set(socket.session, table);
@@ -202,7 +214,6 @@ io.on("connection", function (_socket) {
202
214
  try {
203
215
  table_1 = getTable(tableId);
204
216
  if (table_1 && !table_1.lobby.gameLoop) {
205
- table_1.setState(MatchTable_1.EMatchTableState.STARTED);
206
217
  table_1.lobby
207
218
  .startMatch()
208
219
  .onTurn(function (play) {
@@ -277,15 +288,21 @@ io.on("connection", function (_socket) {
277
288
  /**
278
289
  * Join Match
279
290
  */
280
- socket.on(types_1.EClientEvent.JOIN_MATCH, function (matchSessionId, callback) {
291
+ socket.on(types_1.EClientEvent.JOIN_MATCH, function (matchSessionId, teamIdx, callback) {
281
292
  if (!socket.session) {
282
293
  return callback({ success: false });
283
294
  }
284
295
  var user = getUser(socket.session);
285
296
  var table = tables.get(matchSessionId);
286
- if (table && table.state === MatchTable_1.EMatchTableState.UNREADY) {
297
+ if (table) {
298
+ try {
299
+ table.lobby.addPlayer(user.id || "satoshi", socket.session, teamIdx);
300
+ }
301
+ catch (e) {
302
+ console.error(e);
303
+ return callback({ success: false });
304
+ }
287
305
  socket.join(matchSessionId);
288
- table.lobby.addPlayer(user.id || "satoshi", socket.session);
289
306
  addSocketToUser(socket.session, socket.id, table);
290
307
  emitMatchUpdate(table);
291
308
  return callback({ success: true, match: table.getPublicMatch(socket.session) });
@@ -348,7 +365,7 @@ io.on("connection", function (_socket) {
348
365
  socket.on(types_1.EClientEvent.SET_PLAYER_READY, function (matchSessionId, ready) {
349
366
  try {
350
367
  var table = getTable(matchSessionId);
351
- var player = table.lobby.players.find(function (player) { return player.session === socket.session; });
368
+ var player = table.lobby.players.find(function (player) { return player && player.session === socket.session; });
352
369
  if (player) {
353
370
  player.setReady(ready);
354
371
  emitMatchUpdate(table);
package/package.json CHANGED
@@ -1,28 +1,29 @@
1
- {
2
- "name": "trucoshi",
3
- "version": "0.0.17",
4
- "main": "build/lib/trucoshi.js",
5
- "license": "GPL-3.0",
6
- "scripts": {
7
- "prepublishOnly": "yarn build",
8
- "dev": "nodemon",
9
- "test:autoplay": "yarn run ts-node src/test/autoplay",
10
- "test:play": "yarn run ts-node src/test/play",
11
- "test:legacy": "yarn run ts-node src/test/legacy",
12
- "build": "yarn run rimraf ./dist && yarn run tsc --project ."
13
- },
14
- "devDependencies": {
15
- "@types/node": "^18.11.18",
16
- "nodemon": "^2.0.20"
17
- },
18
- "files": [
19
- "dist"
20
- ],
21
- "dependencies": {
22
- "rimraf": "^4.1.1",
23
- "socket.io": "^4.5.4",
24
- "ts-node": "^10.9.1",
25
- "tsc": "^2.0.4",
26
- "typescript": "^4.9.4"
27
- }
28
- }
1
+ {
2
+ "name": "trucoshi",
3
+ "version": "0.0.18",
4
+ "main": "build/lib/trucoshi.js",
5
+ "license": "GPL-3.0",
6
+ "scripts": {
7
+ "start": "node ./dist/server/index.js",
8
+ "prepublishOnly": "yarn build",
9
+ "dev": "nodemon",
10
+ "test:autoplay": "yarn run ts-node src/test/autoplay",
11
+ "test:play": "yarn run ts-node src/test/play",
12
+ "test:legacy": "yarn run ts-node src/test/legacy",
13
+ "build": "yarn run rimraf ./dist && yarn run tsc --project ."
14
+ },
15
+ "devDependencies": {
16
+ "@types/node": "^18.11.18",
17
+ "nodemon": "^2.0.20"
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "dependencies": {
23
+ "rimraf": "^4.1.1",
24
+ "socket.io": "^4.5.4",
25
+ "ts-node": "^10.9.1",
26
+ "tsc": "^2.0.4",
27
+ "typescript": "^4.9.4"
28
+ }
29
+ }