@colyseus/monitor 0.15.6 → 0.15.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/api.js CHANGED
@@ -1,27 +1,18 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
14
5
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.getAPI = void 0;
6
+ exports.getAPI = getAPI;
16
7
  const core_1 = require("@colyseus/core");
17
8
  const express_1 = __importDefault(require("express"));
18
9
  const node_os_utils_1 = __importDefault(require("node-os-utils"));
19
10
  const UNAVAILABLE_ROOM_ERROR = "@colyseus/monitor: room $roomId is not available anymore.";
20
11
  function getAPI(opts) {
21
12
  const api = express_1.default.Router();
22
- api.get("/", (req, res) => __awaiter(this, void 0, void 0, function* () {
13
+ api.get("/", async (req, res) => {
23
14
  try {
24
- const rooms = yield core_1.matchMaker.query({});
15
+ const rooms = await core_1.matchMaker.query({});
25
16
  const columns = opts.columns || ['roomId', 'name', 'clients', 'maxClients', 'locked', 'elapsedTime'];
26
17
  // extend columns to expose "publicAddress", if present
27
18
  if (!opts.columns && rooms[0] && rooms[0].publicAddress !== undefined) {
@@ -41,8 +32,8 @@ function getAPI(opts) {
41
32
  return data;
42
33
  }),
43
34
  connections,
44
- cpu: yield node_os_utils_1.default.cpu.usage(),
45
- memory: yield node_os_utils_1.default.mem.used()
35
+ cpu: await node_os_utils_1.default.cpu.usage(),
36
+ memory: await node_os_utils_1.default.mem.used()
46
37
  });
47
38
  }
48
39
  catch (e) {
@@ -51,11 +42,11 @@ function getAPI(opts) {
51
42
  res.status(500);
52
43
  res.json({ message });
53
44
  }
54
- }));
55
- api.get("/room", (req, res) => __awaiter(this, void 0, void 0, function* () {
45
+ });
46
+ api.get("/room", async (req, res) => {
56
47
  const roomId = req.query.roomId;
57
48
  try {
58
- const inspectData = yield core_1.matchMaker.remoteRoomCall(roomId, "getInspectData");
49
+ const inspectData = await core_1.matchMaker.remoteRoomCall(roomId, "getInspectData");
59
50
  res.json(inspectData);
60
51
  }
61
52
  catch (e) {
@@ -64,13 +55,13 @@ function getAPI(opts) {
64
55
  res.status(500);
65
56
  res.json({ message });
66
57
  }
67
- }));
68
- api.get("/room/call", (req, res) => __awaiter(this, void 0, void 0, function* () {
58
+ });
59
+ api.get("/room/call", async (req, res) => {
69
60
  const roomId = req.query.roomId;
70
61
  const method = req.query.method;
71
62
  const args = JSON.parse(req.query.args);
72
63
  try {
73
- const data = yield core_1.matchMaker.remoteRoomCall(roomId, method, args);
64
+ const data = await core_1.matchMaker.remoteRoomCall(roomId, method, args);
74
65
  res.json(data);
75
66
  }
76
67
  catch (e) {
@@ -79,7 +70,6 @@ function getAPI(opts) {
79
70
  res.status(500);
80
71
  res.json({ message });
81
72
  }
82
- }));
73
+ });
83
74
  return api;
84
75
  }
85
- exports.getAPI = getAPI;
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src-backend/api.ts"],
4
+ "sourcesContent": ["import { matchMaker } from '@colyseus/core';\n\nimport express from 'express';\nimport osUtils from 'node-os-utils';\n\nimport type { MonitorOptions } from './index.js';\n\nconst UNAVAILABLE_ROOM_ERROR = \"@colyseus/monitor: room $roomId is not available anymore.\";\n\nexport function getAPI (opts: Partial<MonitorOptions>) {\n const api = express.Router();\n\n api.get(\"/\", async (req: express.Request, res: express.Response) => {\n try {\n const rooms: any[] = await matchMaker.query({});\n const columns = opts.columns || ['roomId', 'name', 'clients', 'maxClients', 'locked', 'elapsedTime'];\n\n // extend columns to expose \"publicAddress\", if present\n if (!opts.columns && rooms[0] && rooms[0].publicAddress !== undefined) {\n columns.push(\"publicAddress\");\n }\n\n let connections: number = 0;\n\n res.json({\n columns,\n rooms: rooms.map(room => {\n const data = JSON.parse(JSON.stringify(room));\n\n connections += room.clients;\n\n // additional data\n data.locked = room.locked || false;\n data.private = room.private;\n\n data.maxClients = `${room.maxClients}`;\n\n data.elapsedTime = Date.now() - new Date(room.createdAt).getTime();\n return data;\n }),\n\n connections,\n cpu: await osUtils.cpu.usage(),\n memory: await osUtils.mem.used()\n });\n } catch (e) {\n const message = e.message;\n console.error(message);\n res.status(500);\n res.json({ message });\n }\n });\n\n api.get(\"/room\", async (req: express.Request, res: express.Response) => {\n const roomId = req.query.roomId as string;\n try {\n const inspectData = await matchMaker.remoteRoomCall(roomId, \"getInspectData\");\n res.json(inspectData);\n } catch (e) {\n const message = UNAVAILABLE_ROOM_ERROR.replace(\"$roomId\", roomId);\n console.error(message);\n res.status(500);\n res.json({ message });\n }\n });\n\n api.get(\"/room/call\", async (req: express.Request, res: express.Response) => {\n const roomId = req.query.roomId as string;\n const method = req.query.method as string;\n const args = JSON.parse(req.query.args as string);\n\n try {\n const data = await matchMaker.remoteRoomCall(roomId, method, args);\n res.json(data);\n } catch (e) {\n const message = UNAVAILABLE_ROOM_ERROR.replace(\"$roomId\", roomId);\n console.error(message);\n res.status(500);\n res.json({ message });\n }\n });\n\n return api;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA2B;AAE3B,qBAAoB;AACpB,2BAAoB;AAIpB,MAAM,yBAAyB;AAExB,SAAS,OAAQ,MAA+B;AACnD,QAAM,MAAM,eAAAA,QAAQ,OAAO;AAE3B,MAAI,IAAI,KAAK,OAAO,KAAsB,QAA0B;AAChE,QAAI;AACA,YAAM,QAAe,MAAM,uBAAW,MAAM,CAAC,CAAC;AAC9C,YAAM,UAAU,KAAK,WAAW,CAAC,UAAU,QAAQ,WAAW,cAAc,UAAU,aAAa;AAGnG,UAAI,CAAC,KAAK,WAAW,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,kBAAkB,QAAW;AACnE,gBAAQ,KAAK,eAAe;AAAA,MAChC;AAEA,UAAI,cAAsB;AAE1B,UAAI,KAAK;AAAA,QACL;AAAA,QACA,OAAO,MAAM,IAAI,UAAQ;AACrB,gBAAM,OAAO,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAE5C,yBAAe,KAAK;AAGpB,eAAK,SAAS,KAAK,UAAU;AAC7B,eAAK,UAAU,KAAK;AAEpB,eAAK,aAAa,GAAG,KAAK,UAAU;AAEpC,eAAK,cAAc,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AACjE,iBAAO;AAAA,QACX,CAAC;AAAA,QAED;AAAA,QACA,KAAK,MAAM,qBAAAC,QAAQ,IAAI,MAAM;AAAA,QAC7B,QAAQ,MAAM,qBAAAA,QAAQ,IAAI,KAAK;AAAA,MACnC,CAAC;AAAA,IACL,SAAS,GAAG;AACR,YAAM,UAAU,EAAE;AAClB,cAAQ,MAAM,OAAO;AACrB,UAAI,OAAO,GAAG;AACd,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,MAAI,IAAI,SAAS,OAAO,KAAsB,QAA0B;AACpE,UAAM,SAAS,IAAI,MAAM;AACzB,QAAI;AACA,YAAM,cAAc,MAAM,uBAAW,eAAe,QAAQ,gBAAgB;AAC5E,UAAI,KAAK,WAAW;AAAA,IACxB,SAAS,GAAG;AACR,YAAM,UAAU,uBAAuB,QAAQ,WAAW,MAAM;AAChE,cAAQ,MAAM,OAAO;AACrB,UAAI,OAAO,GAAG;AACd,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,MAAI,IAAI,cAAc,OAAO,KAAsB,QAA0B;AACzE,UAAM,SAAS,IAAI,MAAM;AACzB,UAAM,SAAS,IAAI,MAAM;AACzB,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM,IAAc;AAEhD,QAAI;AACA,YAAM,OAAO,MAAM,uBAAW,eAAe,QAAQ,QAAQ,IAAI;AACjE,UAAI,KAAK,IAAI;AAAA,IACjB,SAAS,GAAG;AACR,YAAM,UAAU,uBAAuB,QAAQ,WAAW,MAAM;AAChE,cAAQ,MAAM,OAAO;AACrB,UAAI,OAAO,GAAG;AACd,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;",
6
+ "names": ["express", "osUtils"]
7
+ }
package/build/api.mjs ADDED
@@ -0,0 +1,68 @@
1
+ // src-backend/api.ts
2
+ import { matchMaker } from "@colyseus/core";
3
+ import express from "express";
4
+ import osUtils from "node-os-utils";
5
+ var UNAVAILABLE_ROOM_ERROR = "@colyseus/monitor: room $roomId is not available anymore.";
6
+ function getAPI(opts) {
7
+ const api = express.Router();
8
+ api.get("/", async (req, res) => {
9
+ try {
10
+ const rooms = await matchMaker.query({});
11
+ const columns = opts.columns || ["roomId", "name", "clients", "maxClients", "locked", "elapsedTime"];
12
+ if (!opts.columns && rooms[0] && rooms[0].publicAddress !== void 0) {
13
+ columns.push("publicAddress");
14
+ }
15
+ let connections = 0;
16
+ res.json({
17
+ columns,
18
+ rooms: rooms.map((room) => {
19
+ const data = JSON.parse(JSON.stringify(room));
20
+ connections += room.clients;
21
+ data.locked = room.locked || false;
22
+ data.private = room.private;
23
+ data.maxClients = `${room.maxClients}`;
24
+ data.elapsedTime = Date.now() - new Date(room.createdAt).getTime();
25
+ return data;
26
+ }),
27
+ connections,
28
+ cpu: await osUtils.cpu.usage(),
29
+ memory: await osUtils.mem.used()
30
+ });
31
+ } catch (e) {
32
+ const message = e.message;
33
+ console.error(message);
34
+ res.status(500);
35
+ res.json({ message });
36
+ }
37
+ });
38
+ api.get("/room", async (req, res) => {
39
+ const roomId = req.query.roomId;
40
+ try {
41
+ const inspectData = await matchMaker.remoteRoomCall(roomId, "getInspectData");
42
+ res.json(inspectData);
43
+ } catch (e) {
44
+ const message = UNAVAILABLE_ROOM_ERROR.replace("$roomId", roomId);
45
+ console.error(message);
46
+ res.status(500);
47
+ res.json({ message });
48
+ }
49
+ });
50
+ api.get("/room/call", async (req, res) => {
51
+ const roomId = req.query.roomId;
52
+ const method = req.query.method;
53
+ const args = JSON.parse(req.query.args);
54
+ try {
55
+ const data = await matchMaker.remoteRoomCall(roomId, method, args);
56
+ res.json(data);
57
+ } catch (e) {
58
+ const message = UNAVAILABLE_ROOM_ERROR.replace("$roomId", roomId);
59
+ console.error(message);
60
+ res.status(500);
61
+ res.json({ message });
62
+ }
63
+ });
64
+ return api;
65
+ }
66
+ export {
67
+ getAPI
68
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src-backend/api.ts"],
4
+ "sourcesContent": ["import { matchMaker } from '@colyseus/core';\n\nimport express from 'express';\nimport osUtils from 'node-os-utils';\n\nimport type { MonitorOptions } from './index.js';\n\nconst UNAVAILABLE_ROOM_ERROR = \"@colyseus/monitor: room $roomId is not available anymore.\";\n\nexport function getAPI (opts: Partial<MonitorOptions>) {\n const api = express.Router();\n\n api.get(\"/\", async (req: express.Request, res: express.Response) => {\n try {\n const rooms: any[] = await matchMaker.query({});\n const columns = opts.columns || ['roomId', 'name', 'clients', 'maxClients', 'locked', 'elapsedTime'];\n\n // extend columns to expose \"publicAddress\", if present\n if (!opts.columns && rooms[0] && rooms[0].publicAddress !== undefined) {\n columns.push(\"publicAddress\");\n }\n\n let connections: number = 0;\n\n res.json({\n columns,\n rooms: rooms.map(room => {\n const data = JSON.parse(JSON.stringify(room));\n\n connections += room.clients;\n\n // additional data\n data.locked = room.locked || false;\n data.private = room.private;\n\n data.maxClients = `${room.maxClients}`;\n\n data.elapsedTime = Date.now() - new Date(room.createdAt).getTime();\n return data;\n }),\n\n connections,\n cpu: await osUtils.cpu.usage(),\n memory: await osUtils.mem.used()\n });\n } catch (e) {\n const message = e.message;\n console.error(message);\n res.status(500);\n res.json({ message });\n }\n });\n\n api.get(\"/room\", async (req: express.Request, res: express.Response) => {\n const roomId = req.query.roomId as string;\n try {\n const inspectData = await matchMaker.remoteRoomCall(roomId, \"getInspectData\");\n res.json(inspectData);\n } catch (e) {\n const message = UNAVAILABLE_ROOM_ERROR.replace(\"$roomId\", roomId);\n console.error(message);\n res.status(500);\n res.json({ message });\n }\n });\n\n api.get(\"/room/call\", async (req: express.Request, res: express.Response) => {\n const roomId = req.query.roomId as string;\n const method = req.query.method as string;\n const args = JSON.parse(req.query.args as string);\n\n try {\n const data = await matchMaker.remoteRoomCall(roomId, method, args);\n res.json(data);\n } catch (e) {\n const message = UNAVAILABLE_ROOM_ERROR.replace(\"$roomId\", roomId);\n console.error(message);\n res.status(500);\n res.json({ message });\n }\n });\n\n return api;\n}\n"],
5
+ "mappings": ";AAAA,SAAS,kBAAkB;AAE3B,OAAO,aAAa;AACpB,OAAO,aAAa;AAIpB,IAAM,yBAAyB;AAExB,SAAS,OAAQ,MAA+B;AACnD,QAAM,MAAM,QAAQ,OAAO;AAE3B,MAAI,IAAI,KAAK,OAAO,KAAsB,QAA0B;AAChE,QAAI;AACA,YAAM,QAAe,MAAM,WAAW,MAAM,CAAC,CAAC;AAC9C,YAAM,UAAU,KAAK,WAAW,CAAC,UAAU,QAAQ,WAAW,cAAc,UAAU,aAAa;AAGnG,UAAI,CAAC,KAAK,WAAW,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,kBAAkB,QAAW;AACnE,gBAAQ,KAAK,eAAe;AAAA,MAChC;AAEA,UAAI,cAAsB;AAE1B,UAAI,KAAK;AAAA,QACL;AAAA,QACA,OAAO,MAAM,IAAI,UAAQ;AACrB,gBAAM,OAAO,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAE5C,yBAAe,KAAK;AAGpB,eAAK,SAAS,KAAK,UAAU;AAC7B,eAAK,UAAU,KAAK;AAEpB,eAAK,aAAa,GAAG,KAAK,UAAU;AAEpC,eAAK,cAAc,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AACjE,iBAAO;AAAA,QACX,CAAC;AAAA,QAED;AAAA,QACA,KAAK,MAAM,QAAQ,IAAI,MAAM;AAAA,QAC7B,QAAQ,MAAM,QAAQ,IAAI,KAAK;AAAA,MACnC,CAAC;AAAA,IACL,SAAS,GAAG;AACR,YAAM,UAAU,EAAE;AAClB,cAAQ,MAAM,OAAO;AACrB,UAAI,OAAO,GAAG;AACd,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,MAAI,IAAI,SAAS,OAAO,KAAsB,QAA0B;AACpE,UAAM,SAAS,IAAI,MAAM;AACzB,QAAI;AACA,YAAM,cAAc,MAAM,WAAW,eAAe,QAAQ,gBAAgB;AAC5E,UAAI,KAAK,WAAW;AAAA,IACxB,SAAS,GAAG;AACR,YAAM,UAAU,uBAAuB,QAAQ,WAAW,MAAM;AAChE,cAAQ,MAAM,OAAO;AACrB,UAAI,OAAO,GAAG;AACd,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,MAAI,IAAI,cAAc,OAAO,KAAsB,QAA0B;AACzE,UAAM,SAAS,IAAI,MAAM;AACzB,UAAM,SAAS,IAAI,MAAM;AACzB,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM,IAAc;AAEhD,QAAI;AACA,YAAM,OAAO,MAAM,WAAW,eAAe,QAAQ,QAAQ,IAAI;AACjE,UAAI,KAAK,IAAI;AAAA,IACjB,SAAS,GAAG;AACR,YAAM,UAAU,uBAAuB,QAAQ,WAAW,MAAM;AAChE,cAAQ,MAAM,OAAO;AACrB,UAAI,OAAO,GAAG;AACd,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;",
6
+ "names": []
7
+ }
package/build/ext/Room.js CHANGED
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  //
13
4
  // Monkey-patch Colyseus' default behaviour
@@ -27,43 +18,35 @@ core_1.Room.prototype.getAvailableData = function () {
27
18
  roomId: this.roomId,
28
19
  };
29
20
  };
30
- core_1.Room.prototype.getRoomListData = function () {
31
- return __awaiter(this, void 0, void 0, function* () {
32
- const stateSize = getStateSize(this);
33
- const elapsedTime = this.clock.elapsedTime;
34
- const locked = this.locked;
35
- const data = this.getAvailableData();
36
- return Object.assign(Object.assign({}, data), { locked, elapsedTime, stateSize });
37
- });
21
+ core_1.Room.prototype.getRoomListData = async function () {
22
+ const stateSize = getStateSize(this);
23
+ const elapsedTime = this.clock.elapsedTime;
24
+ const locked = this.locked;
25
+ const data = this.getAvailableData();
26
+ return { ...data, locked, elapsedTime, stateSize };
38
27
  };
39
- core_1.Room.prototype.getInspectData = function () {
40
- return __awaiter(this, void 0, void 0, function* () {
41
- const state = this.state;
42
- const stateSize = getStateSize(this);
43
- const data = this.getAvailableData();
44
- const clients = this.clients.map((client) => ({ sessionId: client.sessionId }));
45
- const locked = this.locked;
46
- return Object.assign(Object.assign({}, data), { locked, clients, state, stateSize });
47
- });
28
+ core_1.Room.prototype.getInspectData = async function () {
29
+ const state = this.state;
30
+ const stateSize = getStateSize(this);
31
+ const data = this.getAvailableData();
32
+ const clients = this.clients.map((client) => ({ sessionId: client.sessionId }));
33
+ const locked = this.locked;
34
+ return { ...data, locked, clients, state, stateSize };
48
35
  };
49
36
  // Actions
50
- core_1.Room.prototype._forceClientDisconnect = function (sessionId) {
51
- return __awaiter(this, void 0, void 0, function* () {
52
- for (let i = 0; i < this.clients.length; i++) {
53
- if (this.clients[i].sessionId === sessionId) {
54
- this.clients[i].leave();
55
- break;
56
- }
37
+ core_1.Room.prototype._forceClientDisconnect = async function (sessionId) {
38
+ for (let i = 0; i < this.clients.length; i++) {
39
+ if (this.clients[i].sessionId === sessionId) {
40
+ this.clients[i].leave();
41
+ break;
57
42
  }
58
- });
43
+ }
59
44
  };
60
- core_1.Room.prototype._sendMessageToClient = function (sessionId, type, data) {
61
- return __awaiter(this, void 0, void 0, function* () {
62
- for (let i = 0; i < this.clients.length; i++) {
63
- if (this.clients[i].sessionId === sessionId) {
64
- this.clients[i].send(type, data);
65
- break;
66
- }
45
+ core_1.Room.prototype._sendMessageToClient = async function (sessionId, type, data) {
46
+ for (let i = 0; i < this.clients.length; i++) {
47
+ if (this.clients[i].sessionId === sessionId) {
48
+ this.clients[i].send(type, data);
49
+ break;
67
50
  }
68
- });
51
+ }
69
52
  };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src-backend/ext/Room.ts"],
4
+ "sourcesContent": ["//\n// Monkey-patch Colyseus' default behaviour\n//\nimport { Room, Client, ClientPrivate } from \"@colyseus/core\";\n\nfunction getStateSize(room) {\n // TODO: `Serializer<T>` should provide a method for this (e.g. `serializer.hasState()`)\n const hasState = (\n room._serializer.encoder || // schema v3\n room._serializer.state || // schema v2\n room._serializer.previousState // legacy-fossil-delta\n );\n const fullState = hasState && room._serializer.getFullState();\n return fullState && (fullState.byteLength || fullState.length) || 0;\n}\n\n(<any>Room.prototype).getAvailableData = function () {\n return {\n clients: this.clients.length,\n maxClients: this.maxClients,\n metadata: this.metadata,\n roomId: this.roomId,\n };\n};\n\n(<any>Room.prototype).getRoomListData = async function () {\n const stateSize = getStateSize(this);\n const elapsedTime = this.clock.elapsedTime;\n const locked = this.locked;\n const data = this.getAvailableData();\n\n return { ...data, locked, elapsedTime, stateSize };\n};\n\n(<any>Room.prototype).getInspectData = async function () {\n const state = this.state;\n const stateSize = getStateSize(this);\n const roomElapsedTime = this.clock.elapsedTime;\n\n const data = this.getAvailableData();\n const clients = this.clients.map((client: Client & ClientPrivate) => ({\n sessionId: client.sessionId,\n elapsedTime: roomElapsedTime - client._joinedAt\n }));\n const locked = this.locked;\n\n return { ...data, locked, clients, state, stateSize };\n};\n\n// Actions\n(<any>Room.prototype)._forceClientDisconnect = async function (sessionId) {\n for (let i = 0; i < this.clients.length; i++) {\n if (this.clients[i].sessionId === sessionId) {\n this.clients[i].leave();\n break;\n }\n }\n};\n\n(<any>Room.prototype)._sendMessageToClient = async function (sessionId, type, data) {\n for (let i = 0; i < this.clients.length; i++) {\n if (this.clients[i].sessionId === sessionId) {\n this.clients[i].send(type, data);\n break;\n }\n }\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAGA,kBAA4C;AAE5C,SAAS,aAAa,MAAM;AAExB,QAAM,WACJ,KAAK,YAAY;AAAA,EACjB,KAAK,YAAY;AAAA,EACjB,KAAK,YAAY;AAEnB,QAAM,YAAY,YAAY,KAAK,YAAY,aAAa;AAC5D,SAAO,cAAc,UAAU,cAAc,UAAU,WAAW;AACtE;AAEM,iBAAK,UAAW,mBAAmB,WAAY;AACjD,SAAO;AAAA,IACH,SAAS,KAAK,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,EACjB;AACJ;AAEM,iBAAK,UAAW,kBAAkB,iBAAkB;AACtD,QAAM,YAAY,aAAa,IAAI;AACnC,QAAM,cAAc,KAAK,MAAM;AAC/B,QAAM,SAAS,KAAK;AACpB,QAAM,OAAO,KAAK,iBAAiB;AAEnC,SAAO,iCAAK,OAAL,EAAW,QAAQ,aAAa,UAAU;AACrD;AAEM,iBAAK,UAAW,iBAAiB,iBAAkB;AACrD,QAAM,QAAQ,KAAK;AACnB,QAAM,YAAY,aAAa,IAAI;AACnC,QAAM,kBAAkB,KAAK,MAAM;AAEnC,QAAM,OAAO,KAAK,iBAAiB;AACnC,QAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,YAAoC;AAAA,IAClE,WAAW,OAAO;AAAA,IAClB,aAAa,kBAAkB,OAAO;AAAA,EAC1C,EAAE;AACF,QAAM,SAAS,KAAK;AAEpB,SAAO,iCAAK,OAAL,EAAW,QAAQ,SAAS,OAAO,UAAU;AACxD;AAGM,iBAAK,UAAW,yBAAyB,eAAgB,WAAW;AACtE,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC1C,QAAI,KAAK,QAAQ,CAAC,EAAE,cAAc,WAAW;AACzC,WAAK,QAAQ,CAAC,EAAE,MAAM;AACtB;AAAA,IACJ;AAAA,EACJ;AACJ;AAEM,iBAAK,UAAW,uBAAuB,eAAgB,WAAW,MAAM,MAAM;AAChF,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC1C,QAAI,KAAK,QAAQ,CAAC,EAAE,cAAc,WAAW;AACzC,WAAK,QAAQ,CAAC,EAAE,KAAK,MAAM,IAAI;AAC/B;AAAA,IACJ;AAAA,EACJ;AACJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,72 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
21
+ // src-backend/ext/Room.ts
22
+ import { Room } from "@colyseus/core";
23
+ function getStateSize(room) {
24
+ const hasState = room._serializer.encoder || // schema v3
25
+ room._serializer.state || // schema v2
26
+ room._serializer.previousState;
27
+ const fullState = hasState && room._serializer.getFullState();
28
+ return fullState && (fullState.byteLength || fullState.length) || 0;
29
+ }
30
+ Room.prototype.getAvailableData = function() {
31
+ return {
32
+ clients: this.clients.length,
33
+ maxClients: this.maxClients,
34
+ metadata: this.metadata,
35
+ roomId: this.roomId
36
+ };
37
+ };
38
+ Room.prototype.getRoomListData = async function() {
39
+ const stateSize = getStateSize(this);
40
+ const elapsedTime = this.clock.elapsedTime;
41
+ const locked = this.locked;
42
+ const data = this.getAvailableData();
43
+ return __spreadProps(__spreadValues({}, data), { locked, elapsedTime, stateSize });
44
+ };
45
+ Room.prototype.getInspectData = async function() {
46
+ const state = this.state;
47
+ const stateSize = getStateSize(this);
48
+ const roomElapsedTime = this.clock.elapsedTime;
49
+ const data = this.getAvailableData();
50
+ const clients = this.clients.map((client) => ({
51
+ sessionId: client.sessionId,
52
+ elapsedTime: roomElapsedTime - client._joinedAt
53
+ }));
54
+ const locked = this.locked;
55
+ return __spreadProps(__spreadValues({}, data), { locked, clients, state, stateSize });
56
+ };
57
+ Room.prototype._forceClientDisconnect = async function(sessionId) {
58
+ for (let i = 0; i < this.clients.length; i++) {
59
+ if (this.clients[i].sessionId === sessionId) {
60
+ this.clients[i].leave();
61
+ break;
62
+ }
63
+ }
64
+ };
65
+ Room.prototype._sendMessageToClient = async function(sessionId, type, data) {
66
+ for (let i = 0; i < this.clients.length; i++) {
67
+ if (this.clients[i].sessionId === sessionId) {
68
+ this.clients[i].send(type, data);
69
+ break;
70
+ }
71
+ }
72
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src-backend/ext/Room.ts"],
4
+ "sourcesContent": ["//\n// Monkey-patch Colyseus' default behaviour\n//\nimport { Room, Client, ClientPrivate } from \"@colyseus/core\";\n\nfunction getStateSize(room) {\n // TODO: `Serializer<T>` should provide a method for this (e.g. `serializer.hasState()`)\n const hasState = (\n room._serializer.encoder || // schema v3\n room._serializer.state || // schema v2\n room._serializer.previousState // legacy-fossil-delta\n );\n const fullState = hasState && room._serializer.getFullState();\n return fullState && (fullState.byteLength || fullState.length) || 0;\n}\n\n(<any>Room.prototype).getAvailableData = function () {\n return {\n clients: this.clients.length,\n maxClients: this.maxClients,\n metadata: this.metadata,\n roomId: this.roomId,\n };\n};\n\n(<any>Room.prototype).getRoomListData = async function () {\n const stateSize = getStateSize(this);\n const elapsedTime = this.clock.elapsedTime;\n const locked = this.locked;\n const data = this.getAvailableData();\n\n return { ...data, locked, elapsedTime, stateSize };\n};\n\n(<any>Room.prototype).getInspectData = async function () {\n const state = this.state;\n const stateSize = getStateSize(this);\n const roomElapsedTime = this.clock.elapsedTime;\n\n const data = this.getAvailableData();\n const clients = this.clients.map((client: Client & ClientPrivate) => ({\n sessionId: client.sessionId,\n elapsedTime: roomElapsedTime - client._joinedAt\n }));\n const locked = this.locked;\n\n return { ...data, locked, clients, state, stateSize };\n};\n\n// Actions\n(<any>Room.prototype)._forceClientDisconnect = async function (sessionId) {\n for (let i = 0; i < this.clients.length; i++) {\n if (this.clients[i].sessionId === sessionId) {\n this.clients[i].leave();\n break;\n }\n }\n};\n\n(<any>Room.prototype)._sendMessageToClient = async function (sessionId, type, data) {\n for (let i = 0; i < this.clients.length; i++) {\n if (this.clients[i].sessionId === sessionId) {\n this.clients[i].send(type, data);\n break;\n }\n }\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAGA,SAAS,YAAmC;AAE5C,SAAS,aAAa,MAAM;AAExB,QAAM,WACJ,KAAK,YAAY;AAAA,EACjB,KAAK,YAAY;AAAA,EACjB,KAAK,YAAY;AAEnB,QAAM,YAAY,YAAY,KAAK,YAAY,aAAa;AAC5D,SAAO,cAAc,UAAU,cAAc,UAAU,WAAW;AACtE;AAEM,KAAK,UAAW,mBAAmB,WAAY;AACjD,SAAO;AAAA,IACH,SAAS,KAAK,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,EACjB;AACJ;AAEM,KAAK,UAAW,kBAAkB,iBAAkB;AACtD,QAAM,YAAY,aAAa,IAAI;AACnC,QAAM,cAAc,KAAK,MAAM;AAC/B,QAAM,SAAS,KAAK;AACpB,QAAM,OAAO,KAAK,iBAAiB;AAEnC,SAAO,iCAAK,OAAL,EAAW,QAAQ,aAAa,UAAU;AACrD;AAEM,KAAK,UAAW,iBAAiB,iBAAkB;AACrD,QAAM,QAAQ,KAAK;AACnB,QAAM,YAAY,aAAa,IAAI;AACnC,QAAM,kBAAkB,KAAK,MAAM;AAEnC,QAAM,OAAO,KAAK,iBAAiB;AACnC,QAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,YAAoC;AAAA,IAClE,WAAW,OAAO;AAAA,IAClB,aAAa,kBAAkB,OAAO;AAAA,EAC1C,EAAE;AACF,QAAM,SAAS,KAAK;AAEpB,SAAO,iCAAK,OAAL,EAAW,QAAQ,SAAS,OAAO,UAAU;AACxD;AAGM,KAAK,UAAW,yBAAyB,eAAgB,WAAW;AACtE,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC1C,QAAI,KAAK,QAAQ,CAAC,EAAE,cAAc,WAAW;AACzC,WAAK,QAAQ,CAAC,EAAE,MAAM;AACtB;AAAA,IACJ;AAAA,EACJ;AACJ;AAEM,KAAK,UAAW,uBAAuB,eAAgB,WAAW,MAAM,MAAM;AAChF,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AAC1C,QAAI,KAAK,QAAQ,CAAC,EAAE,cAAc,WAAW;AACzC,WAAK,QAAQ,CAAC,EAAE,KAAK,MAAM,IAAI;AAC/B;AAAA,IACJ;AAAA,EACJ;AACJ;",
6
+ "names": []
7
+ }
package/build/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.monitor = void 0;
6
+ exports.monitor = monitor;
7
7
  const express_1 = __importDefault(require("express"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const api_1 = require("./api");
@@ -18,4 +18,3 @@ function monitor(opts = {}) {
18
18
  router.use('/api', (0, api_1.getAPI)(opts));
19
19
  return router;
20
20
  }
21
- exports.monitor = monitor;
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src-backend/index.ts"],
4
+ "sourcesContent": ["import express from 'express';\nimport path from 'path';\n\nimport { getAPI } from './api.js';\nimport './ext/Room.js';\n\nconst frontendDirectory = path.resolve(__dirname, \"..\", \"build\", \"static\");\n\nexport interface MonitorOptions {\n columns: Array<\n 'roomId' |\n 'name' |\n 'clients' |\n 'maxClients' |\n 'locked' |\n 'elapsedTime' |\n { metadata: string } |\n 'processId' |\n \"publicAddress\"\n >\n}\n\n/**\n * TODO: expose the `router` instead on next major version.\n */\nexport function monitor (opts: Partial<MonitorOptions> = {}): express.Router {\n const router = express.Router();\n router.use(express.static(frontendDirectory));\n router.use('/api', getAPI(opts));\n return router;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,kBAAiB;AAEjB,iBAAuB;AACvB,kBAAO;AAEP,MAAM,oBAAoB,YAAAA,QAAK,QAAQ,WAAW,MAAM,SAAS,QAAQ;AAmBlE,SAAS,QAAS,OAAgC,CAAC,GAAmB;AACzE,QAAM,SAAS,eAAAC,QAAQ,OAAO;AAC9B,SAAO,IAAI,eAAAA,QAAQ,OAAO,iBAAiB,CAAC;AAC5C,SAAO,IAAI,YAAQ,mBAAO,IAAI,CAAC;AAC/B,SAAO;AACX;",
6
+ "names": ["path", "express"]
7
+ }
@@ -0,0 +1,15 @@
1
+ // src-backend/index.ts
2
+ import express from "express";
3
+ import path from "path";
4
+ import { getAPI } from "./api.mjs";
5
+ import "./ext/Room.mjs";
6
+ var frontendDirectory = path.resolve(__dirname, "..", "build", "static");
7
+ function monitor(opts = {}) {
8
+ const router = express.Router();
9
+ router.use(express.static(frontendDirectory));
10
+ router.use("/api", getAPI(opts));
11
+ return router;
12
+ }
13
+ export {
14
+ monitor
15
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src-backend/index.ts"],
4
+ "sourcesContent": ["import express from 'express';\nimport path from 'path';\n\nimport { getAPI } from './api.js';\nimport './ext/Room.js';\n\nconst frontendDirectory = path.resolve(__dirname, \"..\", \"build\", \"static\");\n\nexport interface MonitorOptions {\n columns: Array<\n 'roomId' |\n 'name' |\n 'clients' |\n 'maxClients' |\n 'locked' |\n 'elapsedTime' |\n { metadata: string } |\n 'processId' |\n \"publicAddress\"\n >\n}\n\n/**\n * TODO: expose the `router` instead on next major version.\n */\nexport function monitor (opts: Partial<MonitorOptions> = {}): express.Router {\n const router = express.Router();\n router.use(express.static(frontendDirectory));\n router.use('/api', getAPI(opts));\n return router;\n}\n"],
5
+ "mappings": ";AAAA,OAAO,aAAa;AACpB,OAAO,UAAU;AAEjB,SAAS,cAAc;AACvB,OAAO;AAEP,IAAM,oBAAoB,KAAK,QAAQ,WAAW,MAAM,SAAS,QAAQ;AAmBlE,SAAS,QAAS,OAAgC,CAAC,GAAmB;AACzE,QAAM,SAAS,QAAQ,OAAO;AAC9B,SAAO,IAAI,QAAQ,OAAO,iBAAiB,CAAC;AAC5C,SAAO,IAAI,QAAQ,OAAO,IAAI,CAAC;AAC/B,SAAO;AACX;",
6
+ "names": []
7
+ }
@@ -15,6 +15,7 @@ export declare class RoomList extends React.Component {
15
15
  updateRoomListInterval: number;
16
16
  isSelected: (index: any) => boolean;
17
17
  componentWillMount(): void;
18
+ componentWillUnmount(): void;
18
19
  fetchRoomList(): Promise<void>;
19
20
  handleRowSelection: (selectedRows: any) => void;
20
21
  inspectRoom(roomId: any): void;
@@ -0,0 +1,6 @@
1
+ import type { MonitorOptions } from "../../";
2
+ export type ExtractStringNames<T> = T extends (infer U)[] ? U extends string ? U : never : never;
3
+ export declare const valueFormatter: {
4
+ [key in ExtractStringNames<MonitorOptions['columns']>]?: Function;
5
+ };
6
+ export declare function humanizeElapsedTime(milliseconds: number): string;
@@ -1,5 +1,3 @@
1
- /// <reference lib="dom" />
2
- import http from "superagent";
3
- export declare function fetchRoomList(): http.SuperAgentRequest;
4
- export declare function fetchRoomData(roomId: string): http.SuperAgentRequest;
5
- export declare function remoteRoomCall(roomId: string, method: string, ...args: any[]): http.SuperAgentRequest;
1
+ export declare function fetchRoomList(): Promise<any>;
2
+ export declare function fetchRoomData(roomId: string): Promise<any>;
3
+ export declare function remoteRoomCall(roomId: string, method: string, ...args: any[]): Promise<any>;
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare function App(): React.JSX.Element;
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ export declare class CAppBar extends React.Component {
3
+ state: {
4
+ open: boolean;
5
+ };
6
+ handleToggle: () => void;
7
+ render(): React.JSX.Element;
8
+ }
@@ -0,0 +1,40 @@
1
+ import * as React from "react";
2
+ import 'react18-json-view/src/style.css';
3
+ interface Props {
4
+ }
5
+ interface State {
6
+ roomId?: string;
7
+ state: any;
8
+ clients: Array<{
9
+ sessionId: string;
10
+ elapsedTime: number;
11
+ }>;
12
+ maxClients: number;
13
+ stateSize: number;
14
+ locked: boolean;
15
+ currentTab: string;
16
+ sendDialogTitle: string;
17
+ sendDialogOpen: boolean;
18
+ sendToClient?: any;
19
+ sendType: string;
20
+ sendData: string;
21
+ }
22
+ export declare class RoomInspect extends React.Component<Props, State> {
23
+ state: State;
24
+ updateDataInterval: number;
25
+ componentDidMount(): void;
26
+ fetchRoomData(): void;
27
+ roomCall(method: string, ...args: any[]): Promise<void>;
28
+ componentWillUnmount(): void;
29
+ sendMessage(sessionId?: string): void;
30
+ disconnectClient(sessionId: string): void;
31
+ disposeRoom(): void;
32
+ updateSendType: (e: any) => void;
33
+ updateSendData: (changes: any) => void;
34
+ handleCloseSend: () => void;
35
+ handleSend: () => void;
36
+ goBack(): void;
37
+ handleTabChange: (event: React.SyntheticEvent, newValue: string) => void;
38
+ render(): React.JSX.Element;
39
+ }
40
+ export {};
@@ -0,0 +1,29 @@
1
+ import * as React from "react";
2
+ import { GridColDef } from '@mui/x-data-grid';
3
+ export declare class RoomList extends React.Component {
4
+ state: {
5
+ selected: number[];
6
+ rooms: any[];
7
+ connections: number;
8
+ cpu: number;
9
+ memory: {
10
+ totalMemMb: number;
11
+ usedMemMb: number;
12
+ };
13
+ columns: any[];
14
+ };
15
+ updateRoomListInterval: number;
16
+ isSelected: (index: any) => boolean;
17
+ componentWillMount(): void;
18
+ fetchRoomList(): Promise<void>;
19
+ handleRowSelection: (selectedRows: any) => void;
20
+ inspectRoom(roomId: any): void;
21
+ disposeRoom(roomId: any): Promise<void>;
22
+ getColumnHeader(column: any): any;
23
+ getRoomColumn(room: any, column: any): any;
24
+ bytesToStr(size: number): string;
25
+ getColumnsNames(columns: any): Array<GridColDef>;
26
+ getRowsData(rooms: any): Array<any>;
27
+ generateRoomListDataGrid(): JSX.Element;
28
+ render(): React.JSX.Element;
29
+ }
@@ -0,0 +1,6 @@
1
+ import type { MonitorOptions } from "../../";
2
+ export type ExtractStringNames<T> = T extends (infer U)[] ? U extends string ? U : never : never;
3
+ export declare const valueFormatter: {
4
+ [key in ExtractStringNames<MonitorOptions['columns']>]?: Function;
5
+ };
6
+ export declare function humanizeElapsedTime(milliseconds: number): string;
@@ -0,0 +1 @@
1
+ import "./css/index.css";
@@ -0,0 +1,5 @@
1
+ /// <reference lib="dom" />
2
+ import http from "superagent";
3
+ export declare function fetchRoomList(): http.SuperAgentRequest;
4
+ export declare function fetchRoomData(roomId: string): http.SuperAgentRequest;
5
+ export declare function remoteRoomCall(roomId: string, method: string, ...args: any[]): http.SuperAgentRequest;
@@ -0,0 +1,2 @@
1
+ import type { MonitorOptions } from './index.js';
2
+ export declare function getAPI(opts: Partial<MonitorOptions>): any;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import express from 'express';
2
+ import './ext/Room.js';
3
+ export interface MonitorOptions {
4
+ columns: Array<'roomId' | 'name' | 'clients' | 'maxClients' | 'locked' | 'elapsedTime' | {
5
+ metadata: string;
6
+ } | 'processId' | "publicAddress">;
7
+ }
8
+ /**
9
+ * TODO: expose the `router` instead on next major version.
10
+ */
11
+ export declare function monitor(opts?: Partial<MonitorOptions>): express.Router;