@minecraft-docker/mcctl-api 1.7.6

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.
Files changed (82) hide show
  1. package/README.md +142 -0
  2. package/dist/app.d.ts +7 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +83 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config/index.d.ts +32 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js +124 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +20 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/rcon.d.ts +35 -0
  15. package/dist/lib/rcon.d.ts.map +1 -0
  16. package/dist/lib/rcon.js +90 -0
  17. package/dist/lib/rcon.js.map +1 -0
  18. package/dist/plugins/auth.d.ts +32 -0
  19. package/dist/plugins/auth.d.ts.map +1 -0
  20. package/dist/plugins/auth.js +194 -0
  21. package/dist/plugins/auth.js.map +1 -0
  22. package/dist/plugins/swagger.d.ts +170 -0
  23. package/dist/plugins/swagger.d.ts.map +1 -0
  24. package/dist/plugins/swagger.js +211 -0
  25. package/dist/plugins/swagger.js.map +1 -0
  26. package/dist/routes/auth.d.ts +12 -0
  27. package/dist/routes/auth.d.ts.map +1 -0
  28. package/dist/routes/auth.js +144 -0
  29. package/dist/routes/auth.js.map +1 -0
  30. package/dist/routes/backup.d.ts +9 -0
  31. package/dist/routes/backup.d.ts.map +1 -0
  32. package/dist/routes/backup.js +271 -0
  33. package/dist/routes/backup.js.map +1 -0
  34. package/dist/routes/console.d.ts +6 -0
  35. package/dist/routes/console.d.ts.map +1 -0
  36. package/dist/routes/console.js +90 -0
  37. package/dist/routes/console.js.map +1 -0
  38. package/dist/routes/players.d.ts +9 -0
  39. package/dist/routes/players.d.ts.map +1 -0
  40. package/dist/routes/players.js +353 -0
  41. package/dist/routes/players.js.map +1 -0
  42. package/dist/routes/router.d.ts +10 -0
  43. package/dist/routes/router.d.ts.map +1 -0
  44. package/dist/routes/router.js +55 -0
  45. package/dist/routes/router.js.map +1 -0
  46. package/dist/routes/servers/actions.d.ts +6 -0
  47. package/dist/routes/servers/actions.d.ts.map +1 -0
  48. package/dist/routes/servers/actions.js +65 -0
  49. package/dist/routes/servers/actions.js.map +1 -0
  50. package/dist/routes/servers.d.ts +10 -0
  51. package/dist/routes/servers.d.ts.map +1 -0
  52. package/dist/routes/servers.js +403 -0
  53. package/dist/routes/servers.js.map +1 -0
  54. package/dist/routes/worlds.d.ts +10 -0
  55. package/dist/routes/worlds.d.ts.map +1 -0
  56. package/dist/routes/worlds.js +341 -0
  57. package/dist/routes/worlds.js.map +1 -0
  58. package/dist/schemas/backup.d.ts +47 -0
  59. package/dist/schemas/backup.d.ts.map +1 -0
  60. package/dist/schemas/backup.js +43 -0
  61. package/dist/schemas/backup.js.map +1 -0
  62. package/dist/schemas/player.d.ts +46 -0
  63. package/dist/schemas/player.d.ts.map +1 -0
  64. package/dist/schemas/player.js +46 -0
  65. package/dist/schemas/player.js.map +1 -0
  66. package/dist/schemas/router.d.ts +42 -0
  67. package/dist/schemas/router.d.ts.map +1 -0
  68. package/dist/schemas/router.js +26 -0
  69. package/dist/schemas/router.js.map +1 -0
  70. package/dist/schemas/server.d.ts +139 -0
  71. package/dist/schemas/server.d.ts.map +1 -0
  72. package/dist/schemas/server.js +124 -0
  73. package/dist/schemas/server.js.map +1 -0
  74. package/dist/schemas/world.d.ts +142 -0
  75. package/dist/schemas/world.d.ts.map +1 -0
  76. package/dist/schemas/world.js +124 -0
  77. package/dist/schemas/world.js.map +1 -0
  78. package/dist/utils/docker-compose.d.ts +23 -0
  79. package/dist/utils/docker-compose.d.ts.map +1 -0
  80. package/dist/utils/docker-compose.js +100 -0
  81. package/dist/utils/docker-compose.js.map +1 -0
  82. package/package.json +69 -0
@@ -0,0 +1,100 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { config } from '../config/index.js';
4
+ const execPromise = promisify(exec);
5
+ // ============================================================
6
+ // Configuration
7
+ // ============================================================
8
+ /**
9
+ * Platform directory path.
10
+ * Uses config.platformPath which is resolved from:
11
+ * 1. PLATFORM_PATH environment variable
12
+ * 2. MCCTL_ROOT environment variable
13
+ * 3. ~/minecraft-servers (default)
14
+ */
15
+ function getPlatformPath() {
16
+ return config.platformPath;
17
+ }
18
+ // ============================================================
19
+ // Server Name Validation
20
+ // ============================================================
21
+ /**
22
+ * Server name validation regex.
23
+ * Allows alphanumeric characters, hyphens, and underscores.
24
+ * Must start with a letter or number.
25
+ */
26
+ const SERVER_NAME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;
27
+ export function isValidServerName(name) {
28
+ if (!name || name.length === 0 || name.length > 64) {
29
+ return false;
30
+ }
31
+ return SERVER_NAME_REGEX.test(name);
32
+ }
33
+ export function sanitizeServerName(name) {
34
+ // Decode URI component if encoded
35
+ try {
36
+ name = decodeURIComponent(name);
37
+ }
38
+ catch {
39
+ // If decoding fails, use as-is
40
+ }
41
+ return name.trim();
42
+ }
43
+ // ============================================================
44
+ // Docker Compose Commands
45
+ // ============================================================
46
+ /**
47
+ * Execute a docker compose command for a specific server action.
48
+ */
49
+ export async function executeServerAction(serverName, action) {
50
+ const platformPath = getPlatformPath();
51
+ const serviceName = `mc-${serverName}`;
52
+ let command;
53
+ switch (action) {
54
+ case 'start':
55
+ command = `docker compose up -d ${serviceName}`;
56
+ break;
57
+ case 'stop':
58
+ command = `docker compose stop ${serviceName}`;
59
+ break;
60
+ case 'restart':
61
+ command = `docker compose restart ${serviceName}`;
62
+ break;
63
+ default:
64
+ return {
65
+ success: false,
66
+ error: `Unknown action: ${action}`,
67
+ };
68
+ }
69
+ const options = {
70
+ cwd: platformPath,
71
+ timeout: 60000, // 60 second timeout
72
+ env: {
73
+ ...process.env,
74
+ // Ensure Docker Compose uses the correct compose file
75
+ COMPOSE_FILE: 'docker-compose.yml',
76
+ },
77
+ };
78
+ try {
79
+ const { stdout, stderr } = await execPromise(command, options);
80
+ return {
81
+ success: true,
82
+ stdout: typeof stdout === 'string' ? stdout.trim() : stdout?.toString().trim(),
83
+ stderr: typeof stderr === 'string' ? stderr.trim() : stderr?.toString().trim(),
84
+ };
85
+ }
86
+ catch (error) {
87
+ const execError = error;
88
+ return {
89
+ success: false,
90
+ stdout: typeof execError.stdout === 'string' ? execError.stdout.trim() : execError.stdout?.toString().trim(),
91
+ stderr: typeof execError.stderr === 'string' ? execError.stderr.trim() : execError.stderr?.toString().trim(),
92
+ error: execError.message ?? 'Unknown error',
93
+ };
94
+ }
95
+ }
96
+ // ============================================================
97
+ // Export for Testing
98
+ // ============================================================
99
+ export { getPlatformPath };
100
+ //# sourceMappingURL=docker-compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-compose.js","sourceRoot":"","sources":["../../src/utils/docker-compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAepC,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAE/D;;;;;;GAMG;AACH,SAAS,eAAe;IACtB,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC;AAED,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAE/D;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAExD,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,kCAAkC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AAED,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,MAAoB;IAEpB,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,UAAU,EAAE,CAAC;IAEvC,IAAI,OAAe,CAAC;IACpB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,GAAG,wBAAwB,WAAW,EAAE,CAAC;YAChD,MAAM;QACR,KAAK,MAAM;YACT,OAAO,GAAG,uBAAuB,WAAW,EAAE,CAAC;YAC/C,MAAM;QACR,KAAK,SAAS;YACZ,OAAO,GAAG,0BAA0B,WAAW,EAAE,CAAC;YAClD,MAAM;QACR;YACE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mBAAmB,MAAM,EAAE;aACnC,CAAC;IACN,CAAC;IAED,MAAM,OAAO,GAAgB;QAC3B,GAAG,EAAE,YAAY;QACjB,OAAO,EAAE,KAAK,EAAE,oBAAoB;QACpC,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,sDAAsD;YACtD,YAAY,EAAE,oBAAoB;SACnC;KACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC9E,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;SAC/E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,KAAiF,CAAC;QACpG,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC5G,MAAM,EAAE,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;YAC5G,KAAK,EAAE,SAAS,CAAC,OAAO,IAAI,eAAe;SAC5C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,qBAAqB;AACrB,+DAA+D;AAE/D,OAAO,EAAE,eAAe,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@minecraft-docker/mcctl-api",
3
+ "version": "1.7.6",
4
+ "description": "REST API server for managing Docker Minecraft servers",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "mcctl-api": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "scripts": {
18
+ "dev": "tsx watch src/index.ts",
19
+ "build": "tsc",
20
+ "start": "node dist/index.js",
21
+ "start:pm2": "pm2 start dist/index.js --name mcctl-api",
22
+ "stop:pm2": "pm2 stop mcctl-api",
23
+ "restart:pm2": "pm2 restart mcctl-api",
24
+ "logs:pm2": "pm2 logs mcctl-api",
25
+ "clean": "rm -rf dist",
26
+ "lint": "eslint src --ext .ts",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest"
29
+ },
30
+ "keywords": [
31
+ "minecraft",
32
+ "docker",
33
+ "api",
34
+ "fastify",
35
+ "mc-router",
36
+ "server-management"
37
+ ],
38
+ "author": "smallmiro",
39
+ "license": "Apache-2.0",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/smallmiro/minecraft-server-manager.git",
43
+ "directory": "platform/services/mcctl-api"
44
+ },
45
+ "homepage": "https://minecraft-server-manager.readthedocs.io/",
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "dependencies": {
50
+ "@fastify/cors": "^10.0.2",
51
+ "@fastify/helmet": "^12.0.1",
52
+ "@fastify/swagger": "^9.6.1",
53
+ "@fastify/swagger-ui": "^5.2.4",
54
+ "@minecraft-docker/shared": "^1.7.6",
55
+ "@sinclair/typebox": "^0.34.48",
56
+ "bcrypt": "^6.0.0",
57
+ "dotenv": "^16.4.7",
58
+ "fastify": "^5.2.1",
59
+ "fastify-plugin": "^5.1.0",
60
+ "ip-range-check": "^0.2.0"
61
+ },
62
+ "devDependencies": {
63
+ "@types/bcrypt": "^6.0.0",
64
+ "@types/node": "^20.10.0",
65
+ "tsx": "^4.19.2",
66
+ "typescript": "^5.3.0",
67
+ "vitest": "^2.1.8"
68
+ }
69
+ }