diff --git a/package-lock.json b/package-lock.json index e8d5c3f..bd591f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "license": "AGPL-3.0-only", "dependencies": { + "@socket.io/admin-ui": "^0.5.1", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^5.0.0-beta.3", @@ -223,6 +224,37 @@ "node": ">=14" } }, + "node_modules/@socket.io/admin-ui": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@socket.io/admin-ui/-/admin-ui-0.5.1.tgz", + "integrity": "sha512-1dlGL2FGm6T+uL1e6iDvbo2eCINwvW7iVbjIblwh5kPPRM1SP8lmZrbFZf4QNJ/cqQ+JLcx49eXGM9WAB4TK7w==", + "license": "MIT", + "dependencies": { + "@types/bcryptjs": "^2.4.2", + "bcryptjs": "^2.4.3", + "debug": "~4.3.1" + }, + "peerDependencies": { + "socket.io": ">=3.1.0" + } + }, + "node_modules/@socket.io/admin-ui/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -267,6 +299,12 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "devOptional": true }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "license": "MIT" + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -701,6 +739,12 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", + "license": "MIT" + }, "node_modules/better-sqlite3": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.6.0.tgz", diff --git a/package.json b/package.json index 1ddad04..edf5a42 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "author": "JK Effects", "license": "AGPL-3.0-only", "dependencies": { + "@socket.io/admin-ui": "^0.5.1", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^5.0.0-beta.3", diff --git a/src/websocket/endpoints/missionManagement.ts b/src/websocket/endpoints/missionManagement.ts index 5accd3c..f844e74 100644 --- a/src/websocket/endpoints/missionManagement.ts +++ b/src/websocket/endpoints/missionManagement.ts @@ -8,7 +8,7 @@ export default (io: Server, socket: Socket) => { "mission:join", handleEvent( { type: "read", section: "operation", module: "mission" }, - async (data: any) => { + async (data: string, initialized: boolean) => { socket.rooms.forEach((room) => { if (room !== socket.id && room != "home") { socket.leave(room); @@ -40,10 +40,14 @@ export default (io: Server, socket: Socket) => { const mission = MissionMap.read(data); socket.join(data); - socket.emit("status-mission:join", { status: "success" }); + + if (!initialized) { + socket.emit("package-mission", Y.encodeStateAsUpdate(mission.doc)); + } + return { - type: "package-mission", - answer: Y.encodeStateAsUpdate(mission.doc), + type: "status-mission:join", + answer: { status: "success" }, }; } catch (error) { return { type: "status-join:join", answer: { status: "failed", msg: error.message } }; diff --git a/src/websocket/handleEvent.ts b/src/websocket/handleEvent.ts index 9f35efa..7c9b4b0 100644 --- a/src/websocket/handleEvent.ts +++ b/src/websocket/handleEvent.ts @@ -27,10 +27,10 @@ type PermissionPass = export let handleEvent = ( permissions: PermissionPass, - handler: (params: any) => Promise, + handler: (...args: any[]) => Promise, socket: Socket ) => { - return async (args: any) => { + return async (...args: any[]) => { try { const socketData = SocketMap.read(socket.id); if (permissions == "admin") { @@ -46,7 +46,7 @@ export let handleEvent = ( } } - const { answer, type, room } = await handler(args); + const { answer, type, room } = await handler(...args); if (room === undefined || room == "") { socket.emit(type, answer); } else { diff --git a/src/websocket/index.ts b/src/websocket/index.ts index af1adc8..bc1c6e7 100644 --- a/src/websocket/index.ts +++ b/src/websocket/index.ts @@ -5,6 +5,7 @@ import authenticateSocket from "./middleware/authenticateSocket"; import base from "./endpoints/base"; import perRequestCheck from "./middleware/perRequestCheck"; import missionManagement from "./endpoints/missionManagement"; +import { instrument } from "@socket.io/admin-ui"; export default abstract class SocketServer { private static io: Server; @@ -17,6 +18,10 @@ export default abstract class SocketServer { credentials: true, }, }); + instrument(this.io, { + auth: false, + mode: "development", + }); this.io.engine.use(helmet());