diff --git a/libs/contract/api/controllers/xray.ts b/libs/contract/api/controllers/xray.ts index 455cc20..ff206c7 100644 --- a/libs/contract/api/controllers/xray.ts +++ b/libs/contract/api/controllers/xray.ts @@ -4,4 +4,5 @@ export const XRAY_ROUTES = { START: 'start', STOP: 'stop', STATUS: 'status', + NODE_HEALTH_CHECK: 'healthcheck', } as const; diff --git a/libs/contract/api/routes.ts b/libs/contract/api/routes.ts index c0f1a38..1227a8a 100644 --- a/libs/contract/api/routes.ts +++ b/libs/contract/api/routes.ts @@ -7,6 +7,7 @@ export const REST_API = { START: `${ROOT}/${CONTROLLERS.XRAY_CONTROLLER}/${CONTROLLERS.XRAY_ROUTES.START}`, STOP: `${ROOT}/${CONTROLLERS.XRAY_CONTROLLER}/${CONTROLLERS.XRAY_ROUTES.STOP}`, STATUS: `${ROOT}/${CONTROLLERS.XRAY_CONTROLLER}/${CONTROLLERS.XRAY_ROUTES.STATUS}`, + NODE_HEALTH_CHECK: `${ROOT}/${CONTROLLERS.XRAY_CONTROLLER}/${CONTROLLERS.XRAY_ROUTES.NODE_HEALTH_CHECK}`, }, STATS: { GET_USER_ONLINE_STATUS: `${ROOT}/${CONTROLLERS.STATS_CONTROLLER}/${CONTROLLERS.STATS_ROUTES.GET_USER_ONLINE_STATUS}`, diff --git a/libs/contract/commands/xray/get-node-health-check.command.ts b/libs/contract/commands/xray/get-node-health-check.command.ts new file mode 100644 index 0000000..306b05f --- /dev/null +++ b/libs/contract/commands/xray/get-node-health-check.command.ts @@ -0,0 +1,17 @@ +import { z } from 'zod'; + +import { REST_API } from '../../api'; + +export namespace GetNodeHealthCheckCommand { + export const url = REST_API.XRAY.NODE_HEALTH_CHECK; + + export const ResponseSchema = z.object({ + response: z.object({ + isAlive: z.boolean(), + xrayInternalStatusCached: z.boolean(), + xrayVersion: z.string().nullable(), + }), + }); + + export type Response = z.infer; +} diff --git a/libs/contract/commands/xray/index.ts b/libs/contract/commands/xray/index.ts index e4a09c4..d8a6c3c 100644 --- a/libs/contract/commands/xray/index.ts +++ b/libs/contract/commands/xray/index.ts @@ -1,3 +1,4 @@ +export * from './get-node-health-check.command'; export * from './get-status-and-version.command'; export * from './start.command'; export * from './stop.command'; diff --git a/libs/contract/package.json b/libs/contract/package.json index acc4ca5..a7cb67c 100644 --- a/libs/contract/package.json +++ b/libs/contract/package.json @@ -1,6 +1,6 @@ { "name": "@remnawave/node-contract", - "version": "0.3.4", + "version": "0.3.5", "description": "A node-contract library for Remnawave Panel", "main": "build/index.js", "types": "build/index.d.ts", diff --git a/package-lock.json b/package-lock.json index be76e12..109b4bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,28 +1,28 @@ { "name": "@remnawave/node", - "version": "1.1.0", + "version": "1.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@remnawave/node", - "version": "1.1.0", + "version": "1.2.0", "license": "AGPL-3.0-only", "dependencies": { "@cjs-exporter/execa": "9.5.2", - "@nestjs/common": "11.0.10", - "@nestjs/config": "4.0.0", - "@nestjs/core": "11.0.10", + "@nestjs/common": "11.0.11", + "@nestjs/config": "4.0.1", + "@nestjs/core": "11.0.11", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.0.10", + "@nestjs/platform-express": "11.0.11", "@remnawave/xtls-sdk": "0.2.0", "@remnawave/xtls-sdk-nestjs": "0.2.2", "enhanced-ms": "^3.0.0", "helmet": "^7.1.0", "husky": "9.0.11", "morgan": "^1.10.0", - "nest-winston": "^1.9.7", + "nest-winston": "^1.10.2", "nestjs-zod": "3.0.0", "node-object-hash": "^3.1.1", "object-hash": "^3.0.0", @@ -30,23 +30,23 @@ "passport-jwt": "4.0.1", "pretty-bytes": "^5.6.0", "reflect-metadata": "0.2.2", - "rxjs": "7.8.1", + "rxjs": "7.8.2", "semver": "^7.6.3", - "systeminformation": "^5.23.5", + "systeminformation": "^5.25.5", "table": "^6.9.0", "winston": "^3.17.0", "zod": "^3.22.4" }, "devDependencies": { - "@nestjs/cli": "11.0.2", - "@nestjs/schematics": "11.0.0", + "@nestjs/cli": "11.0.5", + "@nestjs/schematics": "11.0.2", "@types/bcryptjs": "^2.4.6", - "@types/express": "^4.17.17", + "@types/express": "^5.0.0", "@types/js-yaml": "^4.0.9", "@types/jsonwebtoken": "^9.0.7", "@types/mjml": "^4.7.4", "@types/morgan": "^1.9.9", - "@types/node": "^20.3.1", + "@types/node": "^22.13.9", "@types/nunjucks": "^3.2.6", "@types/object-hash": "^3.0.6", "@types/passport-jwt": "^4.0.1", @@ -67,9 +67,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.3.tgz", - "integrity": "sha512-of/TKfJ/vL+/qvr4PbDTtqbFJGFHPfu6bEJrIZsLMYA+Mej8SyTx3kDm4LLnKQBtWVYDqkrxvcpOb4+NmHNLfA==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.1.8.tgz", + "integrity": "sha512-j1zHKvOsGwu5YwAZGuzi835R9vcW7PkfxmSRIJeVl+vawgk31K3zFb4UPH8AY/NPWYqXIAnwpka3HC1+JrWLWA==", "dev": true, "license": "MIT", "dependencies": { @@ -94,32 +94,24 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "tslib": "^2.1.0" } }, "node_modules/@angular-devkit/schematics": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.3.tgz", - "integrity": "sha512-DfN45eJQtfXXeQwjb7vDqSJ+8e6BW3rXUB2i6IC2CbOYrLWhMBgfv3/uTm++IbCFW2zX3Yk3yqq3d4yua2no7w==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.1.8.tgz", + "integrity": "sha512-2JGUMD3zjfY8G4RYpypm2/1YEO+O4DtFycUvptIpsBYyULgnEbJ3tlp2oRiXI2vp9tC8IyWqa/swlA8DTI6ZYQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", + "@angular-devkit/core": "19.1.8", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -132,14 +124,14 @@ } }, "node_modules/@angular-devkit/schematics-cli": { - "version": "19.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.1.3.tgz", - "integrity": "sha512-levMPch+Mni/cEVd/b9RUzasxWqlafBVjgrofbaSlxgZmr4pRJ/tihzrNnygNUaXoBqhTtXU5aFxTGbJhS35eA==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-19.1.8.tgz", + "integrity": "sha512-sHblN9EuiJgKwJVYc+nhpU+GlVkAJHJc7lBR8YSoaugNGcCMkWn4f7rJnJDywL/CEOHBICnyWZKfTCMsMyg1Cw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", "@inquirer/prompts": "7.2.1", "ansi-colors": "4.1.3", "symbol-observable": "4.0.0", @@ -179,6 +171,16 @@ "@types/node": ">=18" } }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -459,15 +461,15 @@ "license": "BSD-3-Clause" }, "node_modules/@inquirer/checkbox": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.7.tgz", - "integrity": "sha512-lyoF4uYdBBTnqeB1gjPdYkiQ++fz/iYKaP9DON1ZGlldkvAEJsjaOBRdbl5UW1pOSslBRd701jxhAG0MlhHd2w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.2.tgz", + "integrity": "sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", + "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", - "@inquirer/type": "^3.0.3", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -476,34 +478,44 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/confirm": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.4.tgz", - "integrity": "sha512-EsiT7K4beM5fN5Mz6j866EFA9+v9d5o9VUra3hrg8zY4GHmCS8b616FErbdo5eyKoVotBQkHzMIeeKYsKDStDw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", - "@inquirer/type": "^3.0.3" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/core": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.5.tgz", - "integrity": "sha512-/vyCWhET0ktav/mUeBqJRYTwmjFPIKPRYb3COAw7qORULgipGSUO2vL32lQKki3UxDKJ8BvuEbokaoyCA6YlWw==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", + "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/figures": "^1.0.10", - "@inquirer/type": "^3.0.3", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", @@ -513,17 +525,25 @@ }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/editor": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.4.tgz", - "integrity": "sha512-S8b6+K9PLzxiFGGc02m4syhEu5JsH0BukzRsuZ+tpjJ5aDsDX1WfNfOil2fmsO36Y1RMcpJGxlfQ1yh4WfU28Q==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.7.tgz", + "integrity": "sha512-gktCSQtnSZHaBytkJKMKEuswSk2cDBuXX5rxGFv306mwHfBPjg5UAldw9zWGoEyvA9KpRDkeM4jfrx0rXn0GyA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", - "@inquirer/type": "^3.0.3", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "external-editor": "^3.1.0" }, "engines": { @@ -531,17 +551,22 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/expand": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.7.tgz", - "integrity": "sha512-PsUQ5t7r+DPjW0VVEHzssOTBM2UPHnvBNse7hzuki7f6ekRL94drjjfBLrGEDe7cgj3pguufy/cuFwMeWUWHXw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.9.tgz", + "integrity": "sha512-Xxt6nhomWTAmuSX61kVgglLjMEFGa+7+F6UUtdEUeg7fg4r9vaFttUUKrtkViYYrQBA5Ia1tkOJj2koP9BuLig==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", - "@inquirer/type": "^3.0.3", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -549,6 +574,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/figures": { @@ -562,48 +592,58 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.4.tgz", - "integrity": "sha512-CKKF8otRBdIaVnRxkFLs00VNA9HWlEh3x4SqUfC3A8819TeOZpTYG/p+4Nqu3hh97G+A0lxkOZNYE7KISgU8BA==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.6.tgz", + "integrity": "sha512-1f5AIsZuVjPT4ecA8AwaxDFNHny/tSershP/cTvTDxLdiIGTeILNcKozB0LaYt6mojJLUbOYhpIxicaYf7UKIQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", - "@inquirer/type": "^3.0.3" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/number": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.7.tgz", - "integrity": "sha512-uU2nmXGC0kD8+BLgwZqcgBD1jcw2XFww2GmtP6b4504DkOp+fFAhydt7JzRR1TAI2dmj175p4SZB0lxVssNreA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.9.tgz", + "integrity": "sha512-iN2xZvH3tyIYXLXBvlVh0npk1q/aVuKXZo5hj+K3W3D4ngAEq/DkLpofRzx6oebTUhBvOgryZ+rMV0yImKnG3w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", - "@inquirer/type": "^3.0.3" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/password": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.7.tgz", - "integrity": "sha512-DFpqWLx+C5GV5zeFWuxwDYaeYnTWYphO07pQ2VnP403RIqRIpwBG0ATWf7pF+3IDbaXEtWatCJWxyDrJ+rkj2A==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.9.tgz", + "integrity": "sha512-xBEoOw1XKb0rIN208YU7wM7oJEHhIYkfG7LpTJAEW913GZeaoQerzf5U/LSHI45EVvjAdgNXmXgH51cUXKZcJQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", - "@inquirer/type": "^3.0.3", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2" }, "engines": { @@ -611,42 +651,52 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/prompts": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.3.tgz", - "integrity": "sha512-hzfnm3uOoDySDXfDNOm9usOuYIaQvTgKp/13l1uJoe6UNY+Zpcn2RYt0jXz3yA+yemGHvDOxVzqWl3S5sQq53Q==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.0.6", - "@inquirer/confirm": "^5.1.3", - "@inquirer/editor": "^4.2.3", - "@inquirer/expand": "^4.0.6", - "@inquirer/input": "^4.1.3", - "@inquirer/number": "^3.0.6", - "@inquirer/password": "^4.0.6", - "@inquirer/rawlist": "^4.0.6", - "@inquirer/search": "^3.0.6", - "@inquirer/select": "^4.0.6" + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" }, "engines": { "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/rawlist": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.7.tgz", - "integrity": "sha512-ZeBca+JCCtEIwQMvhuROT6rgFQWWvAImdQmIIP3XoyDFjrp2E0gZlEn65sWIoR6pP2EatYK96pvx0887OATWQQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.9.tgz", + "integrity": "sha512-+5t6ebehKqgoxV8fXwE49HkSF2Rc9ijNiVGEQZwvbMI61/Q5RcD+jWD6Gs1tKdz5lkI8GRBL31iO0HjGK1bv+A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", - "@inquirer/type": "^3.0.3", + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -654,18 +704,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/search": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.7.tgz", - "integrity": "sha512-Krq925SDoLh9AWSNee8mbSIysgyWtcPnSAp5YtPBGCQ+OCO+5KGC8FwLpyxl8wZ2YAov/8Tp21stTRK/fw5SGg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.9.tgz", + "integrity": "sha512-DWmKztkYo9CvldGBaRMr0ETUHgR86zE6sPDVOHsqz4ISe9o1LuiWfgJk+2r75acFclA93J/lqzhT0dTjCzHuoA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", + "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", - "@inquirer/type": "^3.0.3", + "@inquirer/type": "^3.0.4", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -673,18 +728,23 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/select": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.7.tgz", - "integrity": "sha512-ejGBMDSD+Iqk60u5t0Zf2UQhGlJWDM78Ep70XpNufIfc+f4VOTeybYKXu9pDjz87FkRzLiVsGpQG2SzuGlhaJw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.9.tgz", + "integrity": "sha512-BpJyJe7Dkhv2kz7yG7bPSbJLQuu/rqyNlF1CfiiFeFwouegfH+zh13KDyt6+d9DwucKo7hqM3wKLLyJxZMO+Xg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.5", + "@inquirer/core": "^10.1.7", "@inquirer/figures": "^1.0.10", - "@inquirer/type": "^3.0.3", + "@inquirer/type": "^3.0.4", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, @@ -693,12 +753,17 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@inquirer/type": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.3.tgz", - "integrity": "sha512-I4VIHFxUuY1bshGbXZTxCmhwaaEst9s/lll3ekok+o1Z26/ZUKdx8y1b7lsoG6rtsBDwEGfiBJ2SfirjoISLpg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", "dev": true, "license": "MIT", "engines": { @@ -706,6 +771,11 @@ }, "peerDependencies": { "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/@isaacs/cliui": { @@ -917,18 +987,18 @@ } }, "node_modules/@nestjs/cli": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.2.tgz", - "integrity": "sha512-y1dKk+Q94vnWhJe8eoz1Qs5WIYHSgO0xZttsFnDbYW1A6CBUVanc4RocbiyhwC/GjWPO4D5JmTXjW5mRH6wprA==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-11.0.5.tgz", + "integrity": "sha512-ab/d8Ple+dMSQ4pC7RSNjhntpT8gFQQE8y/F/ilaplp7zPGpuxbayRtYbsA/wc1UkJHORDckrqFc8Jh8mrTq2A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.1.3", - "@angular-devkit/schematics": "19.1.3", - "@angular-devkit/schematics-cli": "19.1.3", - "@inquirer/prompts": "7.2.3", - "@nestjs/schematics": "11.0.0", - "ansis": "3.9.0", + "@angular-devkit/core": "19.1.8", + "@angular-devkit/schematics": "19.1.8", + "@angular-devkit/schematics-cli": "19.1.8", + "@inquirer/prompts": "7.3.2", + "@nestjs/schematics": "^11.0.1", + "ansis": "3.16.0", "chokidar": "4.0.3", "cli-table3": "0.6.5", "commander": "4.1.1", @@ -940,7 +1010,7 @@ "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.2.0", "typescript": "5.7.3", - "webpack": "5.97.1", + "webpack": "5.98.0", "webpack-node-externals": "3.0.0" }, "bin": { @@ -1090,9 +1160,9 @@ } }, "node_modules/@nestjs/common": { - "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.0.10.tgz", - "integrity": "sha512-pzGXp14KF2Q4CDZGQgPK4l8zEg7i6cNkb+10yc8ZA5K41cLe3ZbWW1YxtY2e/glHauOJwTLSVjH4tiRVtOTizg==", + "version": "11.0.11", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.0.11.tgz", + "integrity": "sha512-b3zYiho5/XGCnLa7W2hHv5ecSBR1huQrXCHu6pxd+g2HY2B7sKP5CXHMv4gHYqpIqu4ClOb7Q4tLKXMp9LyLUg==", "license": "MIT", "dependencies": { "iterare": "1.2.1", @@ -1119,9 +1189,9 @@ } }, "node_modules/@nestjs/config": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.0.tgz", - "integrity": "sha512-hyhUMtVwlT+tavtPNyekl8iP0QTU1U6awKrgdOSxhMhp3TQMltx7hz2yqGTcARp+19zWPfgJudyxthuD3lPp/Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-4.0.1.tgz", + "integrity": "sha512-0hr6lKS//Wf8A6VcV69ts8uD0fke6jtmmmXSxzvwAzOM/HEXEKYEp21nRU+cpYxlYqm7Khb0oTOoVuDGk+AWUw==", "license": "MIT", "dependencies": { "dotenv": "16.4.7", @@ -1134,9 +1204,9 @@ } }, "node_modules/@nestjs/core": { - "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.0.10.tgz", - "integrity": "sha512-f0qB8ztNWZeAD4E4fUdHConmNYCa/A78U7WJu5mX9OLYfOAs3ESYCDfsH9MRUvkA4Ft4Y1uMmyJo5L4fg4+beg==", + "version": "11.0.11", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.0.11.tgz", + "integrity": "sha512-jMH3jrjrPiaGrkQ5hANNcgDWN+j+hcM5GMQ3jSs4vOWNs3lmKHTVR11wJ9y5tTNnwKydzMogeju0VTUdfXDI5Q==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -1198,9 +1268,9 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "11.0.10", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.0.10.tgz", - "integrity": "sha512-UVSf0yaWFBC2Zn2FOWABXxCnyG8XNIXrNnvTFpbUFqaJu1YDdwJ7wQBBqxq9CtJT7ILqSmfhOU7HS0d/0EAxpw==", + "version": "11.0.11", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.0.11.tgz", + "integrity": "sha512-iv6nH66i/RuRQufg5UUboQ4jQX4NuuePrYQpHB3ueiEIhJm2yLhhNYM6Y2l/76y9woW2eckbiqbzmW/JajAgeQ==", "license": "MIT", "dependencies": { "cors": "2.8.5", @@ -1219,14 +1289,14 @@ } }, "node_modules/@nestjs/schematics": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.0.tgz", - "integrity": "sha512-wts8lG0GfNWw3Wk9aaG5I/wcMIAdm7HjjeThQfUZhJxeIFT82Z3F5+0cYdHH4ii2pYQGiCSrR1VcuMwPiHoecg==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-11.0.2.tgz", + "integrity": "sha512-C4KM3BHBG6tRX8t5UrHdUq8Y49asEfJUora/fBXge3UTAnxKGlXc20p5s2Q0Q1+l+1YaXqTrKGSIbYXdPX8r9g==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.1", - "@angular-devkit/schematics": "19.0.1", + "@angular-devkit/core": "19.2.0", + "@angular-devkit/schematics": "19.2.0", "comment-json": "4.2.5", "jsonc-parser": "3.3.1", "pluralize": "8.0.0" @@ -1236,9 +1306,9 @@ } }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/core": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.1.tgz", - "integrity": "sha512-oXIAV3hXqUW3Pmm95pvEmb+24n1cKQG62FzhQSjOIrMeHiCbGLNuc8zHosIi2oMrcCJJxR6KzWjThvbuzDwWlw==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.0.tgz", + "integrity": "sha512-qd2nYoHZOYWRsu4MjXG8KiDtfM9ZDRR2rDGa+rDZ3CYAsngCrPmqOebun10dncUjwAidX49P4S2U2elOmX3VYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1264,15 +1334,15 @@ } }, "node_modules/@nestjs/schematics/node_modules/@angular-devkit/schematics": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.1.tgz", - "integrity": "sha512-N9dV8WpNRULykNj8fSxQrta85gPKxb315J3xugLS2uwiFWhz7wo5EY1YeYhoVKoVcNB2ng9imJgC5aO52AHZwg==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.0.tgz", + "integrity": "sha512-cGGqUGqBXIGJkeL65l70y0BflDAu/0Zi/ohbYat3hvadFfumRJnVElVfJ59JtWO7FfKQjxcwCVTyuQ/tevX/9A==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.0.1", + "@angular-devkit/core": "19.2.0", "jsonc-parser": "3.3.1", - "magic-string": "0.30.12", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -1282,32 +1352,14 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@nestjs/schematics/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@nestjs/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@nestjs/schematics/node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "tslib": "^2.1.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -1580,22 +1632,22 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", + "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", + "@types/express-serve-static-core": "^5.0.0", "@types/qs": "*", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, "license": "MIT", "dependencies": { @@ -1670,12 +1722,12 @@ } }, "node_modules/@types/node": { - "version": "20.17.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", - "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "version": "22.13.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz", + "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.20.0" } }, "node_modules/@types/nunjucks": { @@ -1725,9 +1777,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "dev": true, "license": "MIT" }, @@ -2233,9 +2285,9 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2324,13 +2376,13 @@ } }, "node_modules/ansis": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.9.0.tgz", - "integrity": "sha512-PcDrVe15ldexeZMsVLBAzBwF2KhZgaU0R+CHxH+x5kqn/pO+UWVBZJ+NEXMPpEOLUFeNsnNdoWYc2gwO+MVkDg==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.16.0.tgz", + "integrity": "sha512-sU7d/tfZiYrsIAXbdL/CNZld5bCkruzwT5KmqmadCJYxuLxHAOBjidxD5+iLmN/6xEfjcQq1l7OpsiCBlc4LzA==", "dev": true, "license": "ISC", "engines": { - "node": ">=16" + "node": ">=14" } }, "node_modules/anymatch": { @@ -2597,9 +2649,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -2726,9 +2778,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001701", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz", + "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==", "dev": true, "funding": [ { @@ -3294,9 +3346,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.75", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", - "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", + "version": "1.5.111", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.111.tgz", + "integrity": "sha512-vJyJlO95wQRAw6K2ZGF/8nol7AcbCOnp8S6H91mwOOBbXoS9seDBYxCTPYAFsvXLxl3lc0jLXXe9GLxC4nXVog==", "dev": true, "license": "ISC" }, @@ -3370,9 +3422,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true, "license": "MIT" }, @@ -5443,15 +5495,15 @@ "license": "MIT" }, "node_modules/nest-winston": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/nest-winston/-/nest-winston-1.9.7.tgz", - "integrity": "sha512-pTTgImRgv7urojsDvaTlenAjyJNLj7ywamfjzrhWKhLhp80AKLYNwf103dVHeqZWe+nzp/vd9DGRs/UN/YadOQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/nest-winston/-/nest-winston-1.10.2.tgz", + "integrity": "sha512-Z9IzL/nekBOF/TEwBHUJDiDPMaXUcFquUQOFavIRet6xF0EbuWnOzslyN/ksgzG+fITNgXhMdrL/POp9SdaFxA==", "license": "MIT", "dependencies": { "fast-safe-stringify": "^2.1.1" }, "peerDependencies": { - "@nestjs/common": "^5.0.0 || ^6.6.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/common": "^5.0.0 || ^6.6.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "winston": "^3.0.0" } }, @@ -6367,9 +6419,9 @@ } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -6905,9 +6957,9 @@ } }, "node_modules/systeminformation": { - "version": "5.23.16", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.23.16.tgz", - "integrity": "sha512-1NFCUPy2CAHs5bQUKrcFmi93j8TA5UrlKqSZKvo5jdxcEeuscApay9f0kT13HNWWLenssINDtY6VfddFu7IQjQ==", + "version": "5.25.11", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.25.11.tgz", + "integrity": "sha512-jI01fn/t47rrLTQB0FTlMCC+5dYx8o0RRF+R4BPiUNsvg5OdY0s9DKMFmJGrx5SwMZQ4cag0Gl6v8oycso9b/g==", "license": "MIT", "os": [ "darwin", @@ -6957,9 +7009,9 @@ } }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6976,9 +7028,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.12.tgz", + "integrity": "sha512-jDLYqo7oF8tJIttjXO6jBY5Hk8p3A8W4ttih7cCEq64fQFWmgJ4VqAQjKr7WwIDlmXKEc6QeoRb5ecjZ+2afcg==", "dev": true, "license": "MIT", "dependencies": { @@ -7021,6 +7073,24 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/terser-webpack-plugin/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -7334,9 +7404,9 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "license": "MIT" }, "node_modules/unicorn-magic": { @@ -7371,9 +7441,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -7392,7 +7462,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -7467,9 +7537,9 @@ } }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, "license": "MIT", "dependencies": { @@ -7491,9 +7561,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, @@ -7533,6 +7603,37 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -7557,6 +7658,26 @@ "node": ">=4.0" } }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 9d3c93c..e648c60 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@remnawave/node", - "version": "1.1.0", + "version": "1.2.0", "description": "", "private": true, "license": "AGPL-3.0-only", @@ -27,19 +27,19 @@ }, "dependencies": { "@cjs-exporter/execa": "9.5.2", - "@nestjs/common": "11.0.10", - "@nestjs/config": "4.0.0", - "@nestjs/core": "11.0.10", + "@nestjs/common": "11.0.11", + "@nestjs/config": "4.0.1", + "@nestjs/core": "11.0.11", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.0.10", + "@nestjs/platform-express": "11.0.11", "@remnawave/xtls-sdk": "0.2.0", "@remnawave/xtls-sdk-nestjs": "0.2.2", "enhanced-ms": "^3.0.0", "helmet": "^7.1.0", "husky": "9.0.11", "morgan": "^1.10.0", - "nest-winston": "^1.9.7", + "nest-winston": "^1.10.2", "nestjs-zod": "3.0.0", "node-object-hash": "^3.1.1", "object-hash": "^3.0.0", @@ -47,23 +47,23 @@ "passport-jwt": "4.0.1", "pretty-bytes": "^5.6.0", "reflect-metadata": "0.2.2", - "rxjs": "7.8.1", + "rxjs": "7.8.2", "semver": "^7.6.3", - "systeminformation": "^5.23.5", + "systeminformation": "^5.25.5", "table": "^6.9.0", "winston": "^3.17.0", "zod": "^3.22.4" }, "devDependencies": { - "@nestjs/cli": "11.0.2", - "@nestjs/schematics": "11.0.0", + "@nestjs/cli": "11.0.5", + "@nestjs/schematics": "11.0.2", "@types/bcryptjs": "^2.4.6", - "@types/express": "^4.17.17", + "@types/express": "^5.0.0", "@types/js-yaml": "^4.0.9", "@types/jsonwebtoken": "^9.0.7", "@types/mjml": "^4.7.4", "@types/morgan": "^1.9.9", - "@types/node": "^20.3.1", + "@types/node": "^22.13.9", "@types/nunjucks": "^3.2.6", "@types/object-hash": "^3.0.6", "@types/passport-jwt": "^4.0.1", @@ -82,4 +82,4 @@ "tsconfig-paths": "^4.2.0", "typescript": "5.7.2" } -} +} \ No newline at end of file diff --git a/src/modules/xray-core/dtos/get-node-health-check.dto.ts b/src/modules/xray-core/dtos/get-node-health-check.dto.ts new file mode 100644 index 0000000..3ec0f2e --- /dev/null +++ b/src/modules/xray-core/dtos/get-node-health-check.dto.ts @@ -0,0 +1,7 @@ +import { createZodDto } from 'nestjs-zod'; + +import { GetNodeHealthCheckCommand } from '@libs/contracts/commands'; + +export class GetNodeHealthCheckResponseDto extends createZodDto( + GetNodeHealthCheckCommand.ResponseSchema, +) {} diff --git a/src/modules/xray-core/dtos/index.ts b/src/modules/xray-core/dtos/index.ts index 2a2de45..9164848 100644 --- a/src/modules/xray-core/dtos/index.ts +++ b/src/modules/xray-core/dtos/index.ts @@ -1,3 +1,4 @@ +export * from './get-node-health-check.dto'; export * from './get-xray-status-and-version.dto'; export * from './start-xray.dto'; export * from './stop-xray.dto'; diff --git a/src/modules/xray-core/models/get-node-health-check.model.ts b/src/modules/xray-core/models/get-node-health-check.model.ts new file mode 100644 index 0000000..5e1ee19 --- /dev/null +++ b/src/modules/xray-core/models/get-node-health-check.model.ts @@ -0,0 +1,10 @@ +export class GetNodeHealthCheckResponseModel { + public isAlive: boolean; + public xrayInternalStatusCached: boolean; + public xrayVersion: null | string; + constructor(isAlive: boolean, xrayInternalStatusCached: boolean, xrayVersion: null | string) { + this.isAlive = isAlive; + this.xrayInternalStatusCached = xrayInternalStatusCached; + this.xrayVersion = xrayVersion; + } +} diff --git a/src/modules/xray-core/models/index.ts b/src/modules/xray-core/models/index.ts index 9114af1..7bbb2fe 100644 --- a/src/modules/xray-core/models/index.ts +++ b/src/modules/xray-core/models/index.ts @@ -1,3 +1,4 @@ +export * from './get-node-health-check.model'; export * from './get-xray-status-and-version.response.model'; export * from './start-xray.response.model'; export * from './stop-xray.response.model'; diff --git a/src/modules/xray-core/xray.controller.ts b/src/modules/xray-core/xray.controller.ts index 8ca082b..38fa0fd 100644 --- a/src/modules/xray-core/xray.controller.ts +++ b/src/modules/xray-core/xray.controller.ts @@ -6,6 +6,7 @@ import { JwtDefaultGuard } from '@common/guards/jwt-guards/def-jwt-guard'; import { errorHandler } from '@common/helpers/error-handler.helper'; import { + GetNodeHealthCheckResponseDto, GetXrayStatusAndVersionResponseDto, StartXrayRequestDto, StartXrayResponseDto, @@ -53,4 +54,14 @@ export class XrayController { response: data, }; } + + @Get(XRAY_ROUTES.NODE_HEALTH_CHECK) + public async getNodeHealthCheck(): Promise { + const response = await this.xrayService.getNodeHealthCheck(); + const data = errorHandler(response); + + return { + response: data, + }; + } } diff --git a/src/modules/xray-core/xray.service.ts b/src/modules/xray-core/xray.service.ts index 29c4ed8..9d53ec3 100644 --- a/src/modules/xray-core/xray.service.ts +++ b/src/modules/xray-core/xray.service.ts @@ -14,6 +14,7 @@ import { generateApiConfig } from '@common/utils/generate-api-config'; import { getSystemStats } from '@common/utils/get-system-stats'; import { + GetNodeHealthCheckResponseModel, GetXrayStatusAndVersionResponseModel, StartXrayResponseModel, StopXrayResponseModel, @@ -269,6 +270,26 @@ export class XrayService implements OnApplicationBootstrap, OnModuleInit { } } + public async getNodeHealthCheck(): Promise> { + try { + return { + isOk: true, + response: new GetNodeHealthCheckResponseModel( + true, + this.isXrayOnline, + this.xrayVersion, + ), + }; + } catch (error) { + this.logger.error(`Failed to get Xray status and version ${error}`); + + return { + isOk: true, + response: new GetNodeHealthCheckResponseModel(false, false, null), + }; + } + } + public async killAllXrayProcesses(): Promise { try { await execa('supervisorctl', ['stop', 'xray'], { reject: false });