@colyseus/monitor 0.18.3 → 0.18.4
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/index.cjs +2 -1
- package/build/index.cjs.map +2 -2
- package/build/index.mjs +2 -1
- package/build/index.mjs.map +2 -2
- package/build/static/assets/{index-D9MoG02G.js → index-A9dDB1WV.js} +43 -43
- package/build/static/assets/{index-D9MoG02G.js.map → index-A9dDB1WV.js.map} +1 -1
- package/build/static/index.html +1 -1
- package/package.json +2 -2
- package/src-backend/index.ts +2 -1
package/build/index.cjs
CHANGED
|
@@ -75,7 +75,8 @@ function monitor(opts = {}) {
|
|
|
75
75
|
}),
|
|
76
76
|
connections,
|
|
77
77
|
cpu,
|
|
78
|
-
|
|
78
|
+
// rssMb is this process only — processId says which one it is
|
|
79
|
+
memory: { totalMemMb, usedMemMb, rssMb: process.memoryUsage.rss() / 1024 / 1024, processId: import_core.matchMaker.processId }
|
|
79
80
|
};
|
|
80
81
|
} catch (e) {
|
|
81
82
|
console.error(e.message);
|
package/build/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src-backend/index.ts"],
|
|
4
|
-
"sourcesContent": ["import path from 'path';\nimport { z } from 'zod';\nimport { createEndpoint, dualModeEndpoints, matchMaker, type Endpoint } from '@colyseus/core';\nimport { OSUtils } from 'node-os-utils';\n\nimport { serveStatic } from './serve-static.js';\nimport './ext/Room.js';\n\nconst osutils = new OSUtils();\nconst UNAVAILABLE_ROOM_ERROR = \"@colyseus/monitor: room $roomId is not available anymore.\";\nconst SPA_DIST = path.resolve(import.meta.dirname, '..', 'build', 'static');\n\nexport interface MonitorOptions {\n /** Endpoint path prefix \u2014 namespaces the routes when spread into `createRouter`, honored at root express mounts. Under a path mount (`app.use(\"/stats\", monitor())`) the mount path takes over. Defaults to `'/monitor'`. */\n prefix?: string;\n /** Better-call middleware applied to every monitor endpoint \u2014 use for auth gating. */\n use?: any[];\n /** Columns shown in the rooms grid. */\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: MonitorOptions = {}) {\n const prefix = opts.prefix ?? '/monitor';\n const use = opts.use ?? [];\n const columnsOpt = opts.columns;\n\n const endpoints: Record<string, Endpoint> = {\n 'monitor-api-rooms': createEndpoint(`${prefix}/api`, { method: 'GET', use }, async () => {\n try {\n const rooms: any[] = await matchMaker.query({});\n const columns = columnsOpt ?? ['roomId', 'name', 'clients', 'maxClients', 'locked', 'elapsedTime'];\n\n if (!columnsOpt && rooms[0] && rooms[0].publicAddress !== undefined) {\n columns.push('publicAddress');\n }\n\n let connections = 0;\n const cpuUsage = await osutils.cpu.usage();\n const cpu = cpuUsage.success ? cpuUsage.data : NaN;\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 return {\n columns,\n rooms: rooms.map((room) => {\n const data = JSON.parse(JSON.stringify(room));\n connections += room.clients;\n data.locked = room.locked || false;\n data.private = room.private;\n data.maxClients = `${room.maxClients}`;\n data.elapsedTime = Date.now() - new Date(room.createdAt).getTime();\n return data;\n }),\n connections,\n cpu,\n memory: { totalMemMb, usedMemMb },\n };\n } catch (e: any) {\n console.error(e.message);\n return new Response(JSON.stringify({ message: e.message }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-api-room': createEndpoint(`${prefix}/api/room`, {\n method: 'GET',\n query: z.object({ roomId: z.string() }),\n use,\n }, async (ctx) => {\n const roomId = ctx.query.roomId;\n try {\n return await matchMaker.remoteRoomCall(roomId, 'getInspectData');\n } catch {\n return new Response(JSON.stringify({ message: UNAVAILABLE_ROOM_ERROR.replace('$roomId', roomId) }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-api-room-call': createEndpoint(`${prefix}/api/room/call`, {\n method: 'GET',\n query: z.object({ roomId: z.string(), method: z.string(), args: z.string() }),\n use,\n }, async (ctx) => {\n const { roomId, method } = ctx.query;\n try {\n const args = JSON.parse(ctx.query.args);\n const data = await matchMaker.remoteRoomCall(roomId, method, args);\n return data ?? {};\n } catch {\n return new Response(JSON.stringify({ message: UNAVAILABLE_ROOM_ERROR.replace('$roomId', roomId) }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-index': createEndpoint(`${prefix}/`, { method: 'GET', use }, async () => {\n return serveStatic(SPA_DIST, '');\n }),\n\n 'monitor-static': createEndpoint(`${prefix}/**:splat`, { method: 'GET', use }, async (ctx) => {\n return serveStatic(SPA_DIST, (ctx.params as any).splat);\n }),\n };\n\n return dualModeEndpoints(endpoints, {\n catchAllKey: 'monitor-static',\n prefix,\n staticDir: SPA_DIST,\n });\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,iBAAkB;AAClB,kBAA6E;AAC7E,2BAAwB;AAExB,0BAA4B;AAC5B,kBAAO;AAEP,IAAM,UAAU,IAAI,6BAAQ;AAC5B,IAAM,yBAAyB;AAC/B,IAAM,WAAW,YAAAA,QAAK,QAAQ,WAAqB,MAAM,SAAS,QAAQ;AAqBnE,SAAS,QAAQ,OAAuB,CAAC,GAAG;AA/BnD;AAgCE,QAAM,UAAS,UAAK,WAAL,YAAe;AAC9B,QAAM,OAAM,UAAK,QAAL,YAAY,CAAC;AACzB,QAAM,aAAa,KAAK;AAExB,QAAM,YAAsC;AAAA,IAC1C,yBAAqB,4BAAe,GAAG,MAAM,QAAQ,EAAE,QAAQ,OAAO,IAAI,GAAG,YAAY;AArC7F,UAAAC,KAAAC;AAsCM,UAAI;AACF,cAAM,QAAe,MAAM,uBAAW,MAAM,CAAC,CAAC;AAC9C,cAAM,UAAU,kCAAc,CAAC,UAAU,QAAQ,WAAW,cAAc,UAAU,aAAa;AAEjG,YAAI,CAAC,cAAc,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,kBAAkB,QAAW;AACnE,kBAAQ,KAAK,eAAe;AAAA,QAC9B;AAEA,YAAI,cAAc;AAClB,cAAM,WAAW,MAAM,QAAQ,IAAI,MAAM;AACzC,cAAM,MAAM,SAAS,UAAU,SAAS,OAAO;AAC/C,cAAM,aAAa,MAAM,QAAQ,OAAO,KAAK;AAC7C,cAAM,aAAa,WAAW,WAAUD,MAAA,WAAW,KAAK,UAAhB,gBAAAA,IAAuB,SAAS;AACxE,cAAM,YAAY,WAAW,WAAUC,MAAA,WAAW,KAAK,SAAhB,gBAAAA,IAAsB,SAAS;AAEtE,eAAO;AAAA,UACL;AAAA,UACA,OAAO,MAAM,IAAI,CAAC,SAAS;AACzB,kBAAM,OAAO,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAC5C,2BAAe,KAAK;AACpB,iBAAK,SAAS,KAAK,UAAU;AAC7B,iBAAK,UAAU,KAAK;AACpB,iBAAK,aAAa,GAAG,KAAK,UAAU;AACpC,iBAAK,cAAc,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AACjE,mBAAO;AAAA,UACT,CAAC;AAAA,UACD;AAAA,UACA;AAAA,
|
|
4
|
+
"sourcesContent": ["import path from 'path';\nimport { z } from 'zod';\nimport { createEndpoint, dualModeEndpoints, matchMaker, type Endpoint } from '@colyseus/core';\nimport { OSUtils } from 'node-os-utils';\n\nimport { serveStatic } from './serve-static.js';\nimport './ext/Room.js';\n\nconst osutils = new OSUtils();\nconst UNAVAILABLE_ROOM_ERROR = \"@colyseus/monitor: room $roomId is not available anymore.\";\nconst SPA_DIST = path.resolve(import.meta.dirname, '..', 'build', 'static');\n\nexport interface MonitorOptions {\n /** Endpoint path prefix \u2014 namespaces the routes when spread into `createRouter`, honored at root express mounts. Under a path mount (`app.use(\"/stats\", monitor())`) the mount path takes over. Defaults to `'/monitor'`. */\n prefix?: string;\n /** Better-call middleware applied to every monitor endpoint \u2014 use for auth gating. */\n use?: any[];\n /** Columns shown in the rooms grid. */\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: MonitorOptions = {}) {\n const prefix = opts.prefix ?? '/monitor';\n const use = opts.use ?? [];\n const columnsOpt = opts.columns;\n\n const endpoints: Record<string, Endpoint> = {\n 'monitor-api-rooms': createEndpoint(`${prefix}/api`, { method: 'GET', use }, async () => {\n try {\n const rooms: any[] = await matchMaker.query({});\n const columns = columnsOpt ?? ['roomId', 'name', 'clients', 'maxClients', 'locked', 'elapsedTime'];\n\n if (!columnsOpt && rooms[0] && rooms[0].publicAddress !== undefined) {\n columns.push('publicAddress');\n }\n\n let connections = 0;\n const cpuUsage = await osutils.cpu.usage();\n const cpu = cpuUsage.success ? cpuUsage.data : NaN;\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 return {\n columns,\n rooms: rooms.map((room) => {\n const data = JSON.parse(JSON.stringify(room));\n connections += room.clients;\n data.locked = room.locked || false;\n data.private = room.private;\n data.maxClients = `${room.maxClients}`;\n data.elapsedTime = Date.now() - new Date(room.createdAt).getTime();\n return data;\n }),\n connections,\n cpu,\n // rssMb is this process only \u2014 processId says which one it is\n memory: { totalMemMb, usedMemMb, rssMb: process.memoryUsage.rss() / 1024 / 1024, processId: matchMaker.processId },\n };\n } catch (e: any) {\n console.error(e.message);\n return new Response(JSON.stringify({ message: e.message }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-api-room': createEndpoint(`${prefix}/api/room`, {\n method: 'GET',\n query: z.object({ roomId: z.string() }),\n use,\n }, async (ctx) => {\n const roomId = ctx.query.roomId;\n try {\n return await matchMaker.remoteRoomCall(roomId, 'getInspectData');\n } catch {\n return new Response(JSON.stringify({ message: UNAVAILABLE_ROOM_ERROR.replace('$roomId', roomId) }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-api-room-call': createEndpoint(`${prefix}/api/room/call`, {\n method: 'GET',\n query: z.object({ roomId: z.string(), method: z.string(), args: z.string() }),\n use,\n }, async (ctx) => {\n const { roomId, method } = ctx.query;\n try {\n const args = JSON.parse(ctx.query.args);\n const data = await matchMaker.remoteRoomCall(roomId, method, args);\n return data ?? {};\n } catch {\n return new Response(JSON.stringify({ message: UNAVAILABLE_ROOM_ERROR.replace('$roomId', roomId) }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-index': createEndpoint(`${prefix}/`, { method: 'GET', use }, async () => {\n return serveStatic(SPA_DIST, '');\n }),\n\n 'monitor-static': createEndpoint(`${prefix}/**:splat`, { method: 'GET', use }, async (ctx) => {\n return serveStatic(SPA_DIST, (ctx.params as any).splat);\n }),\n };\n\n return dualModeEndpoints(endpoints, {\n catchAllKey: 'monitor-static',\n prefix,\n staticDir: SPA_DIST,\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,iBAAkB;AAClB,kBAA6E;AAC7E,2BAAwB;AAExB,0BAA4B;AAC5B,kBAAO;AAEP,IAAM,UAAU,IAAI,6BAAQ;AAC5B,IAAM,yBAAyB;AAC/B,IAAM,WAAW,YAAAA,QAAK,QAAQ,WAAqB,MAAM,SAAS,QAAQ;AAqBnE,SAAS,QAAQ,OAAuB,CAAC,GAAG;AA/BnD;AAgCE,QAAM,UAAS,UAAK,WAAL,YAAe;AAC9B,QAAM,OAAM,UAAK,QAAL,YAAY,CAAC;AACzB,QAAM,aAAa,KAAK;AAExB,QAAM,YAAsC;AAAA,IAC1C,yBAAqB,4BAAe,GAAG,MAAM,QAAQ,EAAE,QAAQ,OAAO,IAAI,GAAG,YAAY;AArC7F,UAAAC,KAAAC;AAsCM,UAAI;AACF,cAAM,QAAe,MAAM,uBAAW,MAAM,CAAC,CAAC;AAC9C,cAAM,UAAU,kCAAc,CAAC,UAAU,QAAQ,WAAW,cAAc,UAAU,aAAa;AAEjG,YAAI,CAAC,cAAc,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,kBAAkB,QAAW;AACnE,kBAAQ,KAAK,eAAe;AAAA,QAC9B;AAEA,YAAI,cAAc;AAClB,cAAM,WAAW,MAAM,QAAQ,IAAI,MAAM;AACzC,cAAM,MAAM,SAAS,UAAU,SAAS,OAAO;AAC/C,cAAM,aAAa,MAAM,QAAQ,OAAO,KAAK;AAC7C,cAAM,aAAa,WAAW,WAAUD,MAAA,WAAW,KAAK,UAAhB,gBAAAA,IAAuB,SAAS;AACxE,cAAM,YAAY,WAAW,WAAUC,MAAA,WAAW,KAAK,SAAhB,gBAAAA,IAAsB,SAAS;AAEtE,eAAO;AAAA,UACL;AAAA,UACA,OAAO,MAAM,IAAI,CAAC,SAAS;AACzB,kBAAM,OAAO,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAC5C,2BAAe,KAAK;AACpB,iBAAK,SAAS,KAAK,UAAU;AAC7B,iBAAK,UAAU,KAAK;AACpB,iBAAK,aAAa,GAAG,KAAK,UAAU;AACpC,iBAAK,cAAc,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AACjE,mBAAO;AAAA,UACT,CAAC;AAAA,UACD;AAAA,UACA;AAAA;AAAA,UAEA,QAAQ,EAAE,YAAY,WAAW,OAAO,QAAQ,YAAY,IAAI,IAAI,OAAO,MAAM,WAAW,uBAAW,UAAU;AAAA,QACnH;AAAA,MACF,SAAS,GAAQ;AACf,gBAAQ,MAAM,EAAE,OAAO;AACvB,eAAO,IAAI,SAAS,KAAK,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG;AAAA,UAC1D,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IAED,wBAAoB,4BAAe,GAAG,MAAM,aAAa;AAAA,MACvD,QAAQ;AAAA,MACR,OAAO,aAAE,OAAO,EAAE,QAAQ,aAAE,OAAO,EAAE,CAAC;AAAA,MACtC;AAAA,IACF,GAAG,OAAO,QAAQ;AAChB,YAAM,SAAS,IAAI,MAAM;AACzB,UAAI;AACF,eAAO,MAAM,uBAAW,eAAe,QAAQ,gBAAgB;AAAA,MACjE,SAAQ;AACN,eAAO,IAAI,SAAS,KAAK,UAAU,EAAE,SAAS,uBAAuB,QAAQ,WAAW,MAAM,EAAE,CAAC,GAAG;AAAA,UAClG,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IAED,6BAAyB,4BAAe,GAAG,MAAM,kBAAkB;AAAA,MACjE,QAAQ;AAAA,MACR,OAAO,aAAE,OAAO,EAAE,QAAQ,aAAE,OAAO,GAAG,QAAQ,aAAE,OAAO,GAAG,MAAM,aAAE,OAAO,EAAE,CAAC;AAAA,MAC5E;AAAA,IACF,GAAG,OAAO,QAAQ;AAChB,YAAM,EAAE,QAAQ,OAAO,IAAI,IAAI;AAC/B,UAAI;AACF,cAAM,OAAO,KAAK,MAAM,IAAI,MAAM,IAAI;AACtC,cAAM,OAAO,MAAM,uBAAW,eAAe,QAAQ,QAAQ,IAAI;AACjE,eAAO,sBAAQ,CAAC;AAAA,MAClB,SAAQ;AACN,eAAO,IAAI,SAAS,KAAK,UAAU,EAAE,SAAS,uBAAuB,QAAQ,WAAW,MAAM,EAAE,CAAC,GAAG;AAAA,UAClG,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IAED,qBAAiB,4BAAe,GAAG,MAAM,KAAK,EAAE,QAAQ,OAAO,IAAI,GAAG,YAAY;AAChF,iBAAO,iCAAY,UAAU,EAAE;AAAA,IACjC,CAAC;AAAA,IAED,sBAAkB,4BAAe,GAAG,MAAM,aAAa,EAAE,QAAQ,OAAO,IAAI,GAAG,OAAO,QAAQ;AAC5F,iBAAO,iCAAY,UAAW,IAAI,OAAe,KAAK;AAAA,IACxD,CAAC;AAAA,EACH;AAEA,aAAO,+BAAkB,WAAW;AAAA,IAClC,aAAa;AAAA,IACb;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AACH;",
|
|
6
6
|
"names": ["path", "_a", "_b"]
|
|
7
7
|
}
|
package/build/index.mjs
CHANGED
|
@@ -39,7 +39,8 @@ function monitor(opts = {}) {
|
|
|
39
39
|
}),
|
|
40
40
|
connections,
|
|
41
41
|
cpu,
|
|
42
|
-
|
|
42
|
+
// rssMb is this process only — processId says which one it is
|
|
43
|
+
memory: { totalMemMb, usedMemMb, rssMb: process.memoryUsage.rss() / 1024 / 1024, processId: matchMaker.processId }
|
|
43
44
|
};
|
|
44
45
|
} catch (e) {
|
|
45
46
|
console.error(e.message);
|
package/build/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src-backend/index.ts"],
|
|
4
|
-
"sourcesContent": ["import path from 'path';\nimport { z } from 'zod';\nimport { createEndpoint, dualModeEndpoints, matchMaker, type Endpoint } from '@colyseus/core';\nimport { OSUtils } from 'node-os-utils';\n\nimport { serveStatic } from './serve-static.js';\nimport './ext/Room.js';\n\nconst osutils = new OSUtils();\nconst UNAVAILABLE_ROOM_ERROR = \"@colyseus/monitor: room $roomId is not available anymore.\";\nconst SPA_DIST = path.resolve(import.meta.dirname, '..', 'build', 'static');\n\nexport interface MonitorOptions {\n /** Endpoint path prefix \u2014 namespaces the routes when spread into `createRouter`, honored at root express mounts. Under a path mount (`app.use(\"/stats\", monitor())`) the mount path takes over. Defaults to `'/monitor'`. */\n prefix?: string;\n /** Better-call middleware applied to every monitor endpoint \u2014 use for auth gating. */\n use?: any[];\n /** Columns shown in the rooms grid. */\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: MonitorOptions = {}) {\n const prefix = opts.prefix ?? '/monitor';\n const use = opts.use ?? [];\n const columnsOpt = opts.columns;\n\n const endpoints: Record<string, Endpoint> = {\n 'monitor-api-rooms': createEndpoint(`${prefix}/api`, { method: 'GET', use }, async () => {\n try {\n const rooms: any[] = await matchMaker.query({});\n const columns = columnsOpt ?? ['roomId', 'name', 'clients', 'maxClients', 'locked', 'elapsedTime'];\n\n if (!columnsOpt && rooms[0] && rooms[0].publicAddress !== undefined) {\n columns.push('publicAddress');\n }\n\n let connections = 0;\n const cpuUsage = await osutils.cpu.usage();\n const cpu = cpuUsage.success ? cpuUsage.data : NaN;\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 return {\n columns,\n rooms: rooms.map((room) => {\n const data = JSON.parse(JSON.stringify(room));\n connections += room.clients;\n data.locked = room.locked || false;\n data.private = room.private;\n data.maxClients = `${room.maxClients}`;\n data.elapsedTime = Date.now() - new Date(room.createdAt).getTime();\n return data;\n }),\n connections,\n cpu,\n memory: { totalMemMb, usedMemMb },\n };\n } catch (e: any) {\n console.error(e.message);\n return new Response(JSON.stringify({ message: e.message }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-api-room': createEndpoint(`${prefix}/api/room`, {\n method: 'GET',\n query: z.object({ roomId: z.string() }),\n use,\n }, async (ctx) => {\n const roomId = ctx.query.roomId;\n try {\n return await matchMaker.remoteRoomCall(roomId, 'getInspectData');\n } catch {\n return new Response(JSON.stringify({ message: UNAVAILABLE_ROOM_ERROR.replace('$roomId', roomId) }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-api-room-call': createEndpoint(`${prefix}/api/room/call`, {\n method: 'GET',\n query: z.object({ roomId: z.string(), method: z.string(), args: z.string() }),\n use,\n }, async (ctx) => {\n const { roomId, method } = ctx.query;\n try {\n const args = JSON.parse(ctx.query.args);\n const data = await matchMaker.remoteRoomCall(roomId, method, args);\n return data ?? {};\n } catch {\n return new Response(JSON.stringify({ message: UNAVAILABLE_ROOM_ERROR.replace('$roomId', roomId) }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-index': createEndpoint(`${prefix}/`, { method: 'GET', use }, async () => {\n return serveStatic(SPA_DIST, '');\n }),\n\n 'monitor-static': createEndpoint(`${prefix}/**:splat`, { method: 'GET', use }, async (ctx) => {\n return serveStatic(SPA_DIST, (ctx.params as any).splat);\n }),\n };\n\n return dualModeEndpoints(endpoints, {\n catchAllKey: 'monitor-static',\n prefix,\n staticDir: SPA_DIST,\n });\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,OAAO,UAAU;AACjB,SAAS,SAAS;AAClB,SAAS,gBAAgB,mBAAmB,kBAAiC;AAC7E,SAAS,eAAe;AAExB,SAAS,mBAAmB;AAC5B,OAAO;AAEP,IAAM,UAAU,IAAI,QAAQ;AAC5B,IAAM,yBAAyB;AAC/B,IAAM,WAAW,KAAK,QAAQ,YAAY,SAAS,MAAM,SAAS,QAAQ;AAqBnE,SAAS,QAAQ,OAAuB,CAAC,GAAG;AACjD,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,MAAM,KAAK,OAAO,CAAC;AACzB,QAAM,aAAa,KAAK;AAExB,QAAM,YAAsC;AAAA,IAC1C,qBAAqB,eAAe,GAAG,MAAM,QAAQ,EAAE,QAAQ,OAAO,IAAI,GAAG,YAAY;AACvF,UAAI;AACF,cAAM,QAAe,MAAM,WAAW,MAAM,CAAC,CAAC;AAC9C,cAAM,UAAU,cAAc,CAAC,UAAU,QAAQ,WAAW,cAAc,UAAU,aAAa;AAEjG,YAAI,CAAC,cAAc,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,kBAAkB,QAAW;AACnE,kBAAQ,KAAK,eAAe;AAAA,QAC9B;AAEA,YAAI,cAAc;AAClB,cAAM,WAAW,MAAM,QAAQ,IAAI,MAAM;AACzC,cAAM,MAAM,SAAS,UAAU,SAAS,OAAO;AAC/C,cAAM,aAAa,MAAM,QAAQ,OAAO,KAAK;AAC7C,cAAM,aAAa,WAAW,UAAU,WAAW,KAAK,OAAO,KAAK,IAAI;AACxE,cAAM,YAAY,WAAW,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAEtE,eAAO;AAAA,UACL;AAAA,UACA,OAAO,MAAM,IAAI,CAAC,SAAS;AACzB,kBAAM,OAAO,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAC5C,2BAAe,KAAK;AACpB,iBAAK,SAAS,KAAK,UAAU;AAC7B,iBAAK,UAAU,KAAK;AACpB,iBAAK,aAAa,GAAG,KAAK,UAAU;AACpC,iBAAK,cAAc,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,QAAQ;AACjE,mBAAO;AAAA,UACT,CAAC;AAAA,UACD;AAAA,UACA;AAAA,
|
|
4
|
+
"sourcesContent": ["import path from 'path';\nimport { z } from 'zod';\nimport { createEndpoint, dualModeEndpoints, matchMaker, type Endpoint } from '@colyseus/core';\nimport { OSUtils } from 'node-os-utils';\n\nimport { serveStatic } from './serve-static.js';\nimport './ext/Room.js';\n\nconst osutils = new OSUtils();\nconst UNAVAILABLE_ROOM_ERROR = \"@colyseus/monitor: room $roomId is not available anymore.\";\nconst SPA_DIST = path.resolve(import.meta.dirname, '..', 'build', 'static');\n\nexport interface MonitorOptions {\n /** Endpoint path prefix \u2014 namespaces the routes when spread into `createRouter`, honored at root express mounts. Under a path mount (`app.use(\"/stats\", monitor())`) the mount path takes over. Defaults to `'/monitor'`. */\n prefix?: string;\n /** Better-call middleware applied to every monitor endpoint \u2014 use for auth gating. */\n use?: any[];\n /** Columns shown in the rooms grid. */\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: MonitorOptions = {}) {\n const prefix = opts.prefix ?? '/monitor';\n const use = opts.use ?? [];\n const columnsOpt = opts.columns;\n\n const endpoints: Record<string, Endpoint> = {\n 'monitor-api-rooms': createEndpoint(`${prefix}/api`, { method: 'GET', use }, async () => {\n try {\n const rooms: any[] = await matchMaker.query({});\n const columns = columnsOpt ?? ['roomId', 'name', 'clients', 'maxClients', 'locked', 'elapsedTime'];\n\n if (!columnsOpt && rooms[0] && rooms[0].publicAddress !== undefined) {\n columns.push('publicAddress');\n }\n\n let connections = 0;\n const cpuUsage = await osutils.cpu.usage();\n const cpu = cpuUsage.success ? cpuUsage.data : NaN;\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 return {\n columns,\n rooms: rooms.map((room) => {\n const data = JSON.parse(JSON.stringify(room));\n connections += room.clients;\n data.locked = room.locked || false;\n data.private = room.private;\n data.maxClients = `${room.maxClients}`;\n data.elapsedTime = Date.now() - new Date(room.createdAt).getTime();\n return data;\n }),\n connections,\n cpu,\n // rssMb is this process only \u2014 processId says which one it is\n memory: { totalMemMb, usedMemMb, rssMb: process.memoryUsage.rss() / 1024 / 1024, processId: matchMaker.processId },\n };\n } catch (e: any) {\n console.error(e.message);\n return new Response(JSON.stringify({ message: e.message }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-api-room': createEndpoint(`${prefix}/api/room`, {\n method: 'GET',\n query: z.object({ roomId: z.string() }),\n use,\n }, async (ctx) => {\n const roomId = ctx.query.roomId;\n try {\n return await matchMaker.remoteRoomCall(roomId, 'getInspectData');\n } catch {\n return new Response(JSON.stringify({ message: UNAVAILABLE_ROOM_ERROR.replace('$roomId', roomId) }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-api-room-call': createEndpoint(`${prefix}/api/room/call`, {\n method: 'GET',\n query: z.object({ roomId: z.string(), method: z.string(), args: z.string() }),\n use,\n }, async (ctx) => {\n const { roomId, method } = ctx.query;\n try {\n const args = JSON.parse(ctx.query.args);\n const data = await matchMaker.remoteRoomCall(roomId, method, args);\n return data ?? {};\n } catch {\n return new Response(JSON.stringify({ message: UNAVAILABLE_ROOM_ERROR.replace('$roomId', roomId) }), {\n status: 500,\n headers: { 'content-type': 'application/json' },\n });\n }\n }),\n\n 'monitor-index': createEndpoint(`${prefix}/`, { method: 'GET', use }, async () => {\n return serveStatic(SPA_DIST, '');\n }),\n\n 'monitor-static': createEndpoint(`${prefix}/**:splat`, { method: 'GET', use }, async (ctx) => {\n return serveStatic(SPA_DIST, (ctx.params as any).splat);\n }),\n };\n\n return dualModeEndpoints(endpoints, {\n catchAllKey: 'monitor-static',\n prefix,\n staticDir: SPA_DIST,\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|