@colyseus/monitor 0.16.7 → 0.17.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2015-2026 Endel Dreyer
2
+
3
+ MIT License:
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
package/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # @colyseus/monitor
2
2
 
3
- Web Monitoring Panel for [Colyseus](https://github.com/colyseus/colyseus)
4
-
5
- <img src="media/demo.gif?raw=true" />
3
+ Web Monitoring Panel for Colyseus.
6
4
 
7
5
  You can use an express middleware to enable authentication on the monitor route, such as `express-basic-middleware`:
8
6
 
package/build/api.d.ts CHANGED
@@ -1,2 +1,3 @@
1
+ import express from 'express';
1
2
  import type { MonitorOptions } from './index.js';
2
- export declare function getAPI(opts: Partial<MonitorOptions>): any;
3
+ export declare function getAPI(opts: Partial<MonitorOptions>): express.Router;
package/build/api.js CHANGED
@@ -32,11 +32,13 @@ __export(api_exports, {
32
32
  module.exports = __toCommonJS(api_exports);
33
33
  var import_core = require("@colyseus/core");
34
34
  var import_express = __toESM(require("express"));
35
- var import_node_os_utils = __toESM(require("node-os-utils"));
35
+ var import_node_os_utils = require("node-os-utils");
36
+ const osutils = new import_node_os_utils.OSUtils();
36
37
  const UNAVAILABLE_ROOM_ERROR = "@colyseus/monitor: room $roomId is not available anymore.";
37
38
  function getAPI(opts) {
38
39
  const api = import_express.default.Router();
39
40
  api.get("/", async (req, res) => {
41
+ var _a, _b;
40
42
  try {
41
43
  const rooms = await import_core.matchMaker.query({});
42
44
  const columns = opts.columns || ["roomId", "name", "clients", "maxClients", "locked", "elapsedTime"];
@@ -44,6 +46,11 @@ function getAPI(opts) {
44
46
  columns.push("publicAddress");
45
47
  }
46
48
  let connections = 0;
49
+ const cpuUsage = await osutils.cpu.usage();
50
+ const cpu = cpuUsage.success ? cpuUsage.data : NaN;
51
+ const memoryInfo = await osutils.memory.info();
52
+ const totalMemMb = memoryInfo.success ? (_a = memoryInfo.data.total) == null ? void 0 : _a.toMB() : NaN;
53
+ const usedMemMb = memoryInfo.success ? (_b = memoryInfo.data.used) == null ? void 0 : _b.toMB() : NaN;
47
54
  res.json({
48
55
  columns,
49
56
  rooms: rooms.map((room) => {
@@ -56,8 +63,11 @@ function getAPI(opts) {
56
63
  return data;
57
64
  }),
58
65
  connections,
59
- cpu: await import_node_os_utils.default.cpu.usage(),
60
- memory: await import_node_os_utils.default.mem.used()
66
+ cpu,
67
+ memory: {
68
+ totalMemMb,
69
+ usedMemMb
70
+ }
61
71
  });
62
72
  } catch (e) {
63
73
  const message = e.message;
@@ -73,7 +83,6 @@ function getAPI(opts) {
73
83
  res.json(inspectData);
74
84
  } catch (e) {
75
85
  const message = UNAVAILABLE_ROOM_ERROR.replace("$roomId", roomId);
76
- console.error(message);
77
86
  res.status(500);
78
87
  res.json({ message });
79
88
  }
@@ -87,7 +96,6 @@ function getAPI(opts) {
87
96
  res.json(data);
88
97
  } catch (e) {
89
98
  const message = UNAVAILABLE_ROOM_ERROR.replace("$roomId", roomId);
90
- console.error(message);
91
99
  res.status(500);
92
100
  res.json({ message });
93
101
  }
package/build/api.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"]
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 osutils = new OSUtils();\n\nconst UNAVAILABLE_ROOM_ERROR = \"@colyseus/monitor: room $roomId is not available anymore.\";\n\nexport function getAPI (opts: Partial<MonitorOptions>): express.Router {\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 const cpuUsage = await osutils.cpu.usage();\n const cpu = (cpuUsage.success) ? cpuUsage.data : NaN;\n\n const memoryInfo = await osutils.memory.info();\n const totalMemMb = (memoryInfo.success) ? memoryInfo.data.total?.toMB() : NaN;\n const usedMemMb = (memoryInfo.success) ? memoryInfo.data.used?.toMB() : NaN;\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,\n memory: {\n totalMemMb,\n usedMemMb \n },\n });\n } catch (e: any) {\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 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 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,2BAAwB;AAIxB,MAAM,UAAU,IAAI,6BAAQ;AAE5B,MAAM,yBAAyB;AAExB,SAAS,OAAQ,MAA+C;AACnE,QAAM,MAAM,eAAAA,QAAQ,OAAO;AAE3B,MAAI,IAAI,KAAK,OAAO,KAAsB,QAA0B;AAdxE;AAeQ,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,YAAM,WAAW,MAAM,QAAQ,IAAI,MAAM;AACzC,YAAM,MAAO,SAAS,UAAW,SAAS,OAAO;AAEjD,YAAM,aAAa,MAAM,QAAQ,OAAO,KAAK;AAC7C,YAAM,aAAc,WAAW,WAAW,gBAAW,KAAK,UAAhB,mBAAuB,SAAS;AAC1E,YAAM,YAAa,WAAW,WAAW,gBAAW,KAAK,SAAhB,mBAAsB,SAAS;AAExE,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;AAAA,QACA,QAAQ;AAAA,UACJ;AAAA,UACA;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL,SAAS,GAAQ;AACb,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,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,UAAI,OAAO,GAAG;AACd,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;",
6
+ "names": ["express"]
7
7
  }
package/build/api.mjs CHANGED
@@ -1,7 +1,8 @@
1
1
  // src-backend/api.ts
2
2
  import { matchMaker } from "@colyseus/core";
3
3
  import express from "express";
4
- import osUtils from "node-os-utils";
4
+ import { OSUtils } from "node-os-utils";
5
+ var osutils = new OSUtils();
5
6
  var UNAVAILABLE_ROOM_ERROR = "@colyseus/monitor: room $roomId is not available anymore.";
6
7
  function getAPI(opts) {
7
8
  const api = express.Router();
@@ -13,6 +14,11 @@ function getAPI(opts) {
13
14
  columns.push("publicAddress");
14
15
  }
15
16
  let connections = 0;
17
+ const cpuUsage = await osutils.cpu.usage();
18
+ const cpu = cpuUsage.success ? cpuUsage.data : NaN;
19
+ const memoryInfo = await osutils.memory.info();
20
+ const totalMemMb = memoryInfo.success ? memoryInfo.data.total?.toMB() : NaN;
21
+ const usedMemMb = memoryInfo.success ? memoryInfo.data.used?.toMB() : NaN;
16
22
  res.json({
17
23
  columns,
18
24
  rooms: rooms.map((room) => {
@@ -25,8 +31,11 @@ function getAPI(opts) {
25
31
  return data;
26
32
  }),
27
33
  connections,
28
- cpu: await osUtils.cpu.usage(),
29
- memory: await osUtils.mem.used()
34
+ cpu,
35
+ memory: {
36
+ totalMemMb,
37
+ usedMemMb
38
+ }
30
39
  });
31
40
  } catch (e) {
32
41
  const message = e.message;
@@ -42,7 +51,6 @@ function getAPI(opts) {
42
51
  res.json(inspectData);
43
52
  } catch (e) {
44
53
  const message = UNAVAILABLE_ROOM_ERROR.replace("$roomId", roomId);
45
- console.error(message);
46
54
  res.status(500);
47
55
  res.json({ message });
48
56
  }
@@ -56,7 +64,6 @@ function getAPI(opts) {
56
64
  res.json(data);
57
65
  } catch (e) {
58
66
  const message = UNAVAILABLE_ROOM_ERROR.replace("$roomId", roomId);
59
- console.error(message);
60
67
  res.status(500);
61
68
  res.json({ message });
62
69
  }
package/build/api.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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 osutils = new OSUtils();\n\nconst UNAVAILABLE_ROOM_ERROR = \"@colyseus/monitor: room $roomId is not available anymore.\";\n\nexport function getAPI (opts: Partial<MonitorOptions>): express.Router {\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 const cpuUsage = await osutils.cpu.usage();\n const cpu = (cpuUsage.success) ? cpuUsage.data : NaN;\n\n const memoryInfo = await osutils.memory.info();\n const totalMemMb = (memoryInfo.success) ? memoryInfo.data.total?.toMB() : NaN;\n const usedMemMb = (memoryInfo.success) ? memoryInfo.data.used?.toMB() : NaN;\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,\n memory: {\n totalMemMb,\n usedMemMb \n },\n });\n } catch (e: any) {\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 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 res.status(500);\n res.json({ message });\n }\n });\n\n return api;\n}\n"],
5
+ "mappings": ";AAAA,SAAS,kBAAkB;AAE3B,OAAO,aAAa;AACpB,SAAS,eAAe;AAIxB,IAAM,UAAU,IAAI,QAAQ;AAE5B,IAAM,yBAAyB;AAExB,SAAS,OAAQ,MAA+C;AACnE,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,YAAM,WAAW,MAAM,QAAQ,IAAI,MAAM;AACzC,YAAM,MAAO,SAAS,UAAW,SAAS,OAAO;AAEjD,YAAM,aAAa,MAAM,QAAQ,OAAO,KAAK;AAC7C,YAAM,aAAc,WAAW,UAAW,WAAW,KAAK,OAAO,KAAK,IAAI;AAC1E,YAAM,YAAa,WAAW,UAAW,WAAW,KAAK,MAAM,KAAK,IAAI;AAExE,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;AAAA,QACA,QAAQ;AAAA,UACJ;AAAA,UACA;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL,SAAS,GAAQ;AACb,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,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,UAAI,OAAO,GAAG;AACd,UAAI,KAAK,EAAE,QAAQ,CAAC;AAAA,IACxB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
4
+ "sourcesContent": ["//\n// Monkey-patch Colyseus' default behaviour\n//\nimport { Room, type Client, type 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(Room.prototype as any).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(Room.prototype as any).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(Room.prototype as any).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(Room.prototype as any)._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(Room.prototype as any)._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,kBAAsD;AAEtD,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;AAEC,iBAAK,UAAkB,mBAAmB,WAAY;AACnD,SAAO;AAAA,IACH,SAAS,KAAK,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,EACjB;AACJ;AAEC,iBAAK,UAAkB,kBAAkB,iBAAkB;AACxD,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;AAEC,iBAAK,UAAkB,iBAAiB,iBAAkB;AACvD,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;AAGC,iBAAK,UAAkB,yBAAyB,eAAgB,WAAW;AACxE,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;AAEC,iBAAK,UAAkB,uBAAuB,eAAgB,WAAW,MAAM,MAAM;AAClF,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
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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,EAAE,GAAG,MAAM,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,EAAE,GAAG,MAAM,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;",
4
+ "sourcesContent": ["//\n// Monkey-patch Colyseus' default behaviour\n//\nimport { Room, type Client, type 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(Room.prototype as any).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(Room.prototype as any).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(Room.prototype as any).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(Room.prototype as any)._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(Room.prototype as any)._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,YAA6C;AAEtD,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;AAEC,KAAK,UAAkB,mBAAmB,WAAY;AACnD,SAAO;AAAA,IACH,SAAS,KAAK,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,EACjB;AACJ;AAEC,KAAK,UAAkB,kBAAkB,iBAAkB;AACxD,QAAM,YAAY,aAAa,IAAI;AACnC,QAAM,cAAc,KAAK,MAAM;AAC/B,QAAM,SAAS,KAAK;AACpB,QAAM,OAAO,KAAK,iBAAiB;AAEnC,SAAO,EAAE,GAAG,MAAM,QAAQ,aAAa,UAAU;AACrD;AAEC,KAAK,UAAkB,iBAAiB,iBAAkB;AACvD,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,EAAE,GAAG,MAAM,QAAQ,SAAS,OAAO,UAAU;AACxD;AAGC,KAAK,UAAkB,yBAAyB,eAAgB,WAAW;AACxE,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;AAEC,KAAK,UAAkB,uBAAuB,eAAgB,WAAW,MAAM,MAAM;AAClF,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
6
  "names": []
7
7
  }
package/build/index.d.ts CHANGED
@@ -5,7 +5,4 @@ export interface MonitorOptions {
5
5
  metadata: string;
6
6
  } | 'processId' | "publicAddress">;
7
7
  }
8
- /**
9
- * TODO: expose the `router` instead on next major version.
10
- */
11
8
  export declare function monitor(opts?: Partial<MonitorOptions>): express.Router;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src-backend/index.ts"],
4
- "sourcesContent": ["import express from 'express';\nimport path from 'path';\n\n// required for ESM support. (esbuild uses it)\nimport { fileURLToPath } from 'url';\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;AAKjB,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;",
4
+ "sourcesContent": ["import express from 'express';\nimport path from 'path';\n\n// required for ESM support. (esbuild uses it)\nimport { fileURLToPath } from 'url';\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\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;AAKjB,iBAAuB;AACvB,kBAAO;AAEP,MAAM,oBAAoB,YAAAA,QAAK,QAAQ,WAAW,MAAM,SAAS,QAAQ;AAgBlE,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
6
  "names": ["path", "express"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src-backend/index.ts"],
4
- "sourcesContent": ["import express from 'express';\nimport path from 'path';\n\n// required for ESM support. (esbuild uses it)\nimport { fileURLToPath } from 'url';\n\nimport { getAPI } from './api.js';\nimport './ext/Room.js';\n\nconst frontendDirectory = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"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;AAGjB,SAAS,qBAAqB;AAE9B,SAAS,cAAc;AACvB,OAAO;AAEP,IAAM,oBAAoB,KAAK,QAAQ,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,MAAM,SAAS,QAAQ;AAmBrG,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;",
4
+ "sourcesContent": ["import express from 'express';\nimport path from 'path';\n\n// required for ESM support. (esbuild uses it)\nimport { fileURLToPath } from 'url';\n\nimport { getAPI } from './api.js';\nimport './ext/Room.js';\n\nconst frontendDirectory = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"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\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;AAGjB,SAAS,qBAAqB;AAE9B,SAAS,cAAc;AACvB,OAAO;AAEP,IAAM,oBAAoB,KAAK,QAAQ,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,GAAG,MAAM,SAAS,QAAQ;AAgBrG,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
6
  "names": []
7
7
  }
@@ -0,0 +1 @@
1
+ html,body{margin:0;padding:0}.json-view{display:block;color:#4d4d4d;text-align:left;--json-property: #009033;--json-index: #676dff;--json-number: #676dff;--json-string: #b2762e;--json-boolean: #dc155e;--json-null: #dc155e}.json-view .json-view--property{color:var(--json-property)}.json-view .json-view--index{color:var(--json-index)}.json-view .json-view--number{color:var(--json-number)}.json-view .json-view--string{color:var(--json-string)}.json-view .json-view--boolean{color:var(--json-boolean)}.json-view .json-view--null{color:var(--json-null)}.json-view .jv-indent{padding-left:1em}.json-view .jv-chevron{display:inline-block;vertical-align:-20%;cursor:pointer;opacity:.4;width:1em;height:1em}:is(.json-view .jv-chevron:hover,.json-view .jv-size:hover+.jv-chevron){opacity:.8}.json-view .jv-size{cursor:pointer;opacity:.4;font-size:.875em;font-style:italic;margin-left:.5em;vertical-align:-5%;line-height:1}.json-view :is(.json-view--copy,.json-view--edit),.json-view .json-view--link svg{display:none;width:1em;height:1em;margin-left:.25em;cursor:pointer}.json-view .json-view--input{width:120px;margin-left:.25em;border-radius:4px;border:1px solid currentColor;padding:0 4px;font-size:87.5%;line-height:1.25;background:transparent}.json-view .json-view--deleting{outline:1px solid #da0000;background-color:#da000011;text-decoration-line:line-through}:is(.json-view:hover,.json-view--pair:hover)>:is(.json-view--copy,.json-view--edit),:is(.json-view:hover,.json-view--pair:hover)>.json-view--link svg{display:inline-block}.json-view .jv-button{background:transparent;outline:none;border:none;cursor:pointer;color:inherit}.json-view .cursor-pointer{cursor:pointer}.json-view svg{vertical-align:-10%}.jv-size-chevron~svg{vertical-align:-16%}.json-view_a11y{color:#545454;--json-property: #aa5d00;--json-index: #007299;--json-number: #007299;--json-string: #008000;--json-boolean: #d91e18;--json-null: #d91e18}.json-view_github{color:#005cc5;--json-property: #005cc5;--json-index: #005cc5;--json-number: #005cc5;--json-string: #032f62;--json-boolean: #005cc5;--json-null: #005cc5}.json-view_vscode{color:#005cc5;--json-property: #0451a5;--json-index: #0000ff;--json-number: #0000ff;--json-string: #a31515;--json-boolean: #0000ff;--json-null: #0000ff}.json-view_atom{color:#383a42;--json-property: #e45649;--json-index: #986801;--json-number: #986801;--json-string: #50a14f;--json-boolean: #0184bc;--json-null: #0184bc}.json-view_winter-is-coming{color:#0431fa;--json-property: #3a9685;--json-index: #ae408b;--json-number: #ae408b;--json-string: #8123a9;--json-boolean: #0184bc;--json-null: #0184bc}