@minecraft-docker/mcctl 1.6.0 → 1.6.2

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 (193) hide show
  1. package/dist/application/index.d.ts +2 -0
  2. package/dist/application/index.d.ts.map +1 -0
  3. package/dist/application/index.js +5 -0
  4. package/dist/application/index.js.map +1 -0
  5. package/dist/commands/backup.d.ts +16 -0
  6. package/dist/commands/backup.d.ts.map +1 -0
  7. package/dist/commands/backup.js +182 -0
  8. package/dist/commands/backup.js.map +1 -0
  9. package/dist/commands/ban.d.ts +14 -0
  10. package/dist/commands/ban.d.ts.map +1 -0
  11. package/dist/commands/ban.js +418 -0
  12. package/dist/commands/ban.js.map +1 -0
  13. package/dist/commands/config.d.ts +18 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +106 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/console/api.d.ts +19 -0
  18. package/dist/commands/console/api.d.ts.map +1 -0
  19. package/dist/commands/console/api.js +399 -0
  20. package/dist/commands/console/api.js.map +1 -0
  21. package/dist/commands/console/index.d.ts +10 -0
  22. package/dist/commands/console/index.d.ts.map +1 -0
  23. package/dist/commands/console/index.js +12 -0
  24. package/dist/commands/console/index.js.map +1 -0
  25. package/dist/commands/console/init.d.ts +47 -0
  26. package/dist/commands/console/init.d.ts.map +1 -0
  27. package/dist/commands/console/init.js +491 -0
  28. package/dist/commands/console/init.js.map +1 -0
  29. package/dist/commands/console/remove.d.ts +25 -0
  30. package/dist/commands/console/remove.d.ts.map +1 -0
  31. package/dist/commands/console/remove.js +189 -0
  32. package/dist/commands/console/remove.js.map +1 -0
  33. package/dist/commands/console/service.d.ts +40 -0
  34. package/dist/commands/console/service.d.ts.map +1 -0
  35. package/dist/commands/console/service.js +321 -0
  36. package/dist/commands/console/service.js.map +1 -0
  37. package/dist/commands/console/user.d.ts +17 -0
  38. package/dist/commands/console/user.d.ts.map +1 -0
  39. package/dist/commands/console/user.js +431 -0
  40. package/dist/commands/console/user.js.map +1 -0
  41. package/dist/commands/create.d.ts +22 -0
  42. package/dist/commands/create.d.ts.map +1 -0
  43. package/dist/commands/create.js +86 -0
  44. package/dist/commands/create.js.map +1 -0
  45. package/dist/commands/delete.d.ts +17 -0
  46. package/dist/commands/delete.d.ts.map +1 -0
  47. package/dist/commands/delete.js +74 -0
  48. package/dist/commands/delete.js.map +1 -0
  49. package/dist/commands/exec.d.ts +10 -0
  50. package/dist/commands/exec.d.ts.map +1 -0
  51. package/dist/commands/exec.js +29 -0
  52. package/dist/commands/exec.js.map +1 -0
  53. package/dist/commands/index.d.ts +21 -0
  54. package/dist/commands/index.d.ts.map +1 -0
  55. package/dist/commands/index.js +23 -0
  56. package/dist/commands/index.js.map +1 -0
  57. package/dist/commands/init.d.ts +9 -0
  58. package/dist/commands/init.d.ts.map +1 -0
  59. package/dist/commands/init.js +218 -0
  60. package/dist/commands/init.js.map +1 -0
  61. package/dist/commands/kick.d.ts +12 -0
  62. package/dist/commands/kick.d.ts.map +1 -0
  63. package/dist/commands/kick.js +71 -0
  64. package/dist/commands/kick.js.map +1 -0
  65. package/dist/commands/migrate.d.ts +18 -0
  66. package/dist/commands/migrate.d.ts.map +1 -0
  67. package/dist/commands/migrate.js +470 -0
  68. package/dist/commands/migrate.js.map +1 -0
  69. package/dist/commands/mod.d.ts +19 -0
  70. package/dist/commands/mod.d.ts.map +1 -0
  71. package/dist/commands/mod.js +441 -0
  72. package/dist/commands/mod.js.map +1 -0
  73. package/dist/commands/msg.d.ts +12 -0
  74. package/dist/commands/msg.d.ts.map +1 -0
  75. package/dist/commands/msg.js +273 -0
  76. package/dist/commands/msg.js.map +1 -0
  77. package/dist/commands/op.d.ts +12 -0
  78. package/dist/commands/op.d.ts.map +1 -0
  79. package/dist/commands/op.js +220 -0
  80. package/dist/commands/op.js.map +1 -0
  81. package/dist/commands/player-online.d.ts +11 -0
  82. package/dist/commands/player-online.d.ts.map +1 -0
  83. package/dist/commands/player-online.js +153 -0
  84. package/dist/commands/player-online.js.map +1 -0
  85. package/dist/commands/player.d.ts +18 -0
  86. package/dist/commands/player.d.ts.map +1 -0
  87. package/dist/commands/player.js +352 -0
  88. package/dist/commands/player.js.map +1 -0
  89. package/dist/commands/server-backup.d.ts +36 -0
  90. package/dist/commands/server-backup.d.ts.map +1 -0
  91. package/dist/commands/server-backup.js +320 -0
  92. package/dist/commands/server-backup.js.map +1 -0
  93. package/dist/commands/server-restore.d.ts +13 -0
  94. package/dist/commands/server-restore.d.ts.map +1 -0
  95. package/dist/commands/server-restore.js +294 -0
  96. package/dist/commands/server-restore.js.map +1 -0
  97. package/dist/commands/status.d.ts +13 -0
  98. package/dist/commands/status.d.ts.map +1 -0
  99. package/dist/commands/status.js +325 -0
  100. package/dist/commands/status.js.map +1 -0
  101. package/dist/commands/whitelist.d.ts +12 -0
  102. package/dist/commands/whitelist.d.ts.map +1 -0
  103. package/dist/commands/whitelist.js +316 -0
  104. package/dist/commands/whitelist.js.map +1 -0
  105. package/dist/commands/world.d.ts +18 -0
  106. package/dist/commands/world.d.ts.map +1 -0
  107. package/dist/commands/world.js +238 -0
  108. package/dist/commands/world.js.map +1 -0
  109. package/dist/domain/index.d.ts +2 -0
  110. package/dist/domain/index.d.ts.map +1 -0
  111. package/dist/domain/index.js +7 -0
  112. package/dist/domain/index.js.map +1 -0
  113. package/dist/index.d.ts +3 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +766 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +30 -0
  118. package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -0
  119. package/dist/infrastructure/adapters/ClackPromptAdapter.js +430 -0
  120. package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -0
  121. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts +78 -0
  122. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts.map +1 -0
  123. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js +391 -0
  124. package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js.map +1 -0
  125. package/dist/infrastructure/adapters/index.d.ts +4 -0
  126. package/dist/infrastructure/adapters/index.d.ts.map +1 -0
  127. package/dist/infrastructure/adapters/index.js +6 -0
  128. package/dist/infrastructure/adapters/index.js.map +1 -0
  129. package/dist/infrastructure/di/container.d.ts +47 -0
  130. package/dist/infrastructure/di/container.d.ts.map +1 -0
  131. package/dist/infrastructure/di/container.js +140 -0
  132. package/dist/infrastructure/di/container.js.map +1 -0
  133. package/dist/infrastructure/di/index.d.ts +2 -0
  134. package/dist/infrastructure/di/index.d.ts.map +1 -0
  135. package/dist/infrastructure/di/index.js +2 -0
  136. package/dist/infrastructure/di/index.js.map +1 -0
  137. package/dist/infrastructure/index.d.ts +5 -0
  138. package/dist/infrastructure/index.d.ts.map +1 -0
  139. package/dist/infrastructure/index.js +8 -0
  140. package/dist/infrastructure/index.js.map +1 -0
  141. package/dist/lib/admin-config.d.ts +66 -0
  142. package/dist/lib/admin-config.d.ts.map +1 -0
  143. package/dist/lib/admin-config.js +130 -0
  144. package/dist/lib/admin-config.js.map +1 -0
  145. package/dist/lib/mojang-api.d.ts +51 -0
  146. package/dist/lib/mojang-api.d.ts.map +1 -0
  147. package/dist/lib/mojang-api.js +136 -0
  148. package/dist/lib/mojang-api.js.map +1 -0
  149. package/dist/lib/player-cache.d.ts +79 -0
  150. package/dist/lib/player-cache.d.ts.map +1 -0
  151. package/dist/lib/player-cache.js +302 -0
  152. package/dist/lib/player-cache.js.map +1 -0
  153. package/dist/lib/player-json.d.ts +69 -0
  154. package/dist/lib/player-json.d.ts.map +1 -0
  155. package/dist/lib/player-json.js +96 -0
  156. package/dist/lib/player-json.js.map +1 -0
  157. package/dist/lib/pm2-utils.d.ts +71 -0
  158. package/dist/lib/pm2-utils.d.ts.map +1 -0
  159. package/dist/lib/pm2-utils.js +155 -0
  160. package/dist/lib/pm2-utils.js.map +1 -0
  161. package/dist/lib/prompts/action-select.d.ts +23 -0
  162. package/dist/lib/prompts/action-select.d.ts.map +1 -0
  163. package/dist/lib/prompts/action-select.js +124 -0
  164. package/dist/lib/prompts/action-select.js.map +1 -0
  165. package/dist/lib/prompts/index.d.ts +7 -0
  166. package/dist/lib/prompts/index.d.ts.map +1 -0
  167. package/dist/lib/prompts/index.js +7 -0
  168. package/dist/lib/prompts/index.js.map +1 -0
  169. package/dist/lib/prompts/ip-select.d.ts +25 -0
  170. package/dist/lib/prompts/ip-select.d.ts.map +1 -0
  171. package/dist/lib/prompts/ip-select.js +255 -0
  172. package/dist/lib/prompts/ip-select.js.map +1 -0
  173. package/dist/lib/prompts/player-select.d.ts +25 -0
  174. package/dist/lib/prompts/player-select.d.ts.map +1 -0
  175. package/dist/lib/prompts/player-select.js +122 -0
  176. package/dist/lib/prompts/player-select.js.map +1 -0
  177. package/dist/lib/prompts/server-select.d.ts +26 -0
  178. package/dist/lib/prompts/server-select.d.ts.map +1 -0
  179. package/dist/lib/prompts/server-select.js +99 -0
  180. package/dist/lib/prompts/server-select.js.map +1 -0
  181. package/dist/lib/rcon.d.ts +53 -0
  182. package/dist/lib/rcon.d.ts.map +1 -0
  183. package/dist/lib/rcon.js +131 -0
  184. package/dist/lib/rcon.js.map +1 -0
  185. package/dist/lib/shell.d.ts +111 -0
  186. package/dist/lib/shell.d.ts.map +1 -0
  187. package/dist/lib/shell.js +321 -0
  188. package/dist/lib/shell.js.map +1 -0
  189. package/dist/lib/sudo-utils.d.ts +14 -0
  190. package/dist/lib/sudo-utils.d.ts.map +1 -0
  191. package/dist/lib/sudo-utils.js +53 -0
  192. package/dist/lib/sudo-utils.js.map +1 -0
  193. package/package.json +8 -2
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Player Cache System
3
+ * Encrypted local cache for Mojang API responses to minimize rate limiting
4
+ */
5
+ import { createCipheriv, createDecipheriv, randomBytes, createHash, pbkdf2Sync } from 'node:crypto';
6
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, statSync } from 'node:fs';
7
+ import { join, dirname } from 'node:path';
8
+ import { homedir, hostname, platform, userInfo } from 'node:os';
9
+ import { getMojangApiClient, getOfflinePlayerInfo, } from './mojang-api.js';
10
+ const CACHE_VERSION = 1;
11
+ const CACHE_FILENAME = '.player-cache';
12
+ const ENCRYPTION_ALGORITHM = 'aes-256-gcm';
13
+ // Cache duration constants (in milliseconds)
14
+ const CACHE_DURATION = {
15
+ UUID: Infinity, // UUID never changes
16
+ USERNAME: 30 * 24 * 60 * 60 * 1000, // 30 days (name changes allowed)
17
+ SKIN: 24 * 60 * 60 * 1000, // 1 day (changes frequently)
18
+ };
19
+ /**
20
+ * Player cache with AES-256-GCM encryption
21
+ */
22
+ export class PlayerCache {
23
+ cachePath;
24
+ cache = null;
25
+ encryptionKey = null;
26
+ constructor(cacheDir) {
27
+ const baseDir = cacheDir ?? join(homedir(), '.mcctl');
28
+ this.cachePath = join(baseDir, CACHE_FILENAME);
29
+ }
30
+ /**
31
+ * Look up a player by username
32
+ * First checks cache, then Mojang API
33
+ */
34
+ async lookup(username, options = {}) {
35
+ // Offline mode uses calculated UUID
36
+ if (options.offline) {
37
+ return getOfflinePlayerInfo(username);
38
+ }
39
+ const lowerUsername = username.toLowerCase();
40
+ // Check cache first (unless force refresh)
41
+ if (!options.forceRefresh) {
42
+ const cached = await this.getFromCache(lowerUsername);
43
+ if (cached) {
44
+ return {
45
+ name: cached.name,
46
+ uuid: cached.uuid,
47
+ uuidNoDashes: cached.uuidNoDashes,
48
+ skinUrl: cached.skinUrl,
49
+ source: 'cache',
50
+ };
51
+ }
52
+ }
53
+ // Fetch from Mojang API
54
+ const client = getMojangApiClient();
55
+ const info = await client.lookupByUsername(username);
56
+ if (info) {
57
+ // Save to cache
58
+ await this.saveToCache(info);
59
+ }
60
+ return info;
61
+ }
62
+ /**
63
+ * Look up a player with full profile (including skin URL)
64
+ */
65
+ async lookupWithProfile(username, options = {}) {
66
+ const basic = await this.lookup(username, options);
67
+ if (!basic) {
68
+ return null;
69
+ }
70
+ // Check if we need to fetch skin URL
71
+ const lowerUsername = username.toLowerCase();
72
+ const cached = await this.getFromCache(lowerUsername);
73
+ // Check if skin cache is still valid
74
+ const skinValid = cached?.skinUpdatedAt &&
75
+ (Date.now() - cached.skinUpdatedAt) < CACHE_DURATION.SKIN;
76
+ if (!options.forceRefresh && skinValid && cached?.skinUrl) {
77
+ return {
78
+ ...basic,
79
+ skinUrl: cached.skinUrl,
80
+ };
81
+ }
82
+ // Fetch full profile from Mojang
83
+ const client = getMojangApiClient();
84
+ const profile = await client.getProfile(basic.uuid);
85
+ if (profile?.skinUrl) {
86
+ // Update cache with skin URL
87
+ await this.updateSkinInCache(lowerUsername, profile.skinUrl);
88
+ return {
89
+ ...basic,
90
+ skinUrl: profile.skinUrl,
91
+ };
92
+ }
93
+ return basic;
94
+ }
95
+ /**
96
+ * Get player from cache if valid
97
+ */
98
+ async getFromCache(lowerUsername) {
99
+ await this.loadCache();
100
+ if (!this.cache) {
101
+ return null;
102
+ }
103
+ const cached = this.cache.players[lowerUsername];
104
+ if (!cached) {
105
+ return null;
106
+ }
107
+ // Check if name cache is still valid
108
+ const nameAge = Date.now() - cached.nameUpdatedAt;
109
+ if (nameAge > CACHE_DURATION.USERNAME) {
110
+ // Name cache expired, but UUID is still valid
111
+ // Return null to trigger API call, but UUID will be updated in place
112
+ return null;
113
+ }
114
+ return cached;
115
+ }
116
+ /**
117
+ * Save player info to cache
118
+ */
119
+ async saveToCache(info) {
120
+ await this.loadCache();
121
+ if (!this.cache) {
122
+ this.cache = { version: CACHE_VERSION, players: {} };
123
+ }
124
+ const lowerUsername = info.name.toLowerCase();
125
+ const now = Date.now();
126
+ this.cache.players[lowerUsername] = {
127
+ name: info.name,
128
+ uuid: info.uuid,
129
+ uuidNoDashes: info.uuidNoDashes,
130
+ skinUrl: info.skinUrl,
131
+ source: info.source === 'cache' ? 'mojang' : info.source,
132
+ cachedAt: now,
133
+ nameUpdatedAt: now,
134
+ skinUpdatedAt: info.skinUrl ? now : undefined,
135
+ };
136
+ await this.persistCache();
137
+ }
138
+ /**
139
+ * Update skin URL in cache
140
+ */
141
+ async updateSkinInCache(lowerUsername, skinUrl) {
142
+ await this.loadCache();
143
+ if (!this.cache || !this.cache.players[lowerUsername]) {
144
+ return;
145
+ }
146
+ this.cache.players[lowerUsername].skinUrl = skinUrl;
147
+ this.cache.players[lowerUsername].skinUpdatedAt = Date.now();
148
+ await this.persistCache();
149
+ }
150
+ /**
151
+ * Load cache from encrypted file
152
+ */
153
+ async loadCache() {
154
+ if (this.cache !== null) {
155
+ return; // Already loaded
156
+ }
157
+ if (!existsSync(this.cachePath)) {
158
+ this.cache = { version: CACHE_VERSION, players: {} };
159
+ return;
160
+ }
161
+ try {
162
+ const encrypted = JSON.parse(readFileSync(this.cachePath, 'utf-8'));
163
+ const decrypted = await this.decrypt(encrypted);
164
+ this.cache = JSON.parse(decrypted);
165
+ // Migrate old cache versions if needed
166
+ if (this.cache.version !== CACHE_VERSION) {
167
+ this.cache = { version: CACHE_VERSION, players: {} };
168
+ }
169
+ }
170
+ catch {
171
+ // If decryption fails, start fresh
172
+ this.cache = { version: CACHE_VERSION, players: {} };
173
+ }
174
+ }
175
+ /**
176
+ * Persist cache to encrypted file
177
+ */
178
+ async persistCache() {
179
+ if (!this.cache) {
180
+ return;
181
+ }
182
+ // Ensure directory exists
183
+ const dir = dirname(this.cachePath);
184
+ if (!existsSync(dir)) {
185
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
186
+ }
187
+ const data = JSON.stringify(this.cache);
188
+ const encrypted = await this.encrypt(data);
189
+ writeFileSync(this.cachePath, JSON.stringify(encrypted), { mode: 0o600 });
190
+ // Ensure file permissions are correct (owner read/write only)
191
+ try {
192
+ chmodSync(this.cachePath, 0o600);
193
+ }
194
+ catch {
195
+ // Ignore permission errors on some systems
196
+ }
197
+ }
198
+ /**
199
+ * Get or derive encryption key
200
+ */
201
+ getEncryptionKey(salt) {
202
+ if (this.encryptionKey) {
203
+ return this.encryptionKey;
204
+ }
205
+ // Derive key from machine-specific identifiers
206
+ const machineId = this.getMachineIdentifier();
207
+ this.encryptionKey = pbkdf2Sync(machineId, salt, 100000, 32, 'sha256');
208
+ return this.encryptionKey;
209
+ }
210
+ /**
211
+ * Get machine-specific identifier for key derivation
212
+ */
213
+ getMachineIdentifier() {
214
+ // Combine multiple machine-specific values
215
+ const parts = [
216
+ hostname(),
217
+ platform(),
218
+ userInfo().username,
219
+ homedir(),
220
+ // Add more entropy from environment
221
+ process.env.USER || process.env.USERNAME || '',
222
+ ];
223
+ // Hash for consistent length
224
+ return createHash('sha256').update(parts.join('|')).digest('hex');
225
+ }
226
+ /**
227
+ * Encrypt data using AES-256-GCM
228
+ */
229
+ async encrypt(data) {
230
+ const salt = randomBytes(16);
231
+ const key = this.getEncryptionKey(salt);
232
+ const iv = randomBytes(12);
233
+ const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);
234
+ const encrypted = Buffer.concat([
235
+ cipher.update(data, 'utf-8'),
236
+ cipher.final(),
237
+ ]);
238
+ const tag = cipher.getAuthTag();
239
+ return {
240
+ iv: iv.toString('base64'),
241
+ tag: tag.toString('base64'),
242
+ data: encrypted.toString('base64'),
243
+ salt: salt.toString('base64'),
244
+ };
245
+ }
246
+ /**
247
+ * Decrypt data using AES-256-GCM
248
+ */
249
+ async decrypt(encrypted) {
250
+ const salt = Buffer.from(encrypted.salt, 'base64');
251
+ const key = this.getEncryptionKey(salt);
252
+ const iv = Buffer.from(encrypted.iv, 'base64');
253
+ const tag = Buffer.from(encrypted.tag, 'base64');
254
+ const data = Buffer.from(encrypted.data, 'base64');
255
+ const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);
256
+ decipher.setAuthTag(tag);
257
+ const decrypted = Buffer.concat([
258
+ decipher.update(data),
259
+ decipher.final(),
260
+ ]);
261
+ return decrypted.toString('utf-8');
262
+ }
263
+ /**
264
+ * Clear all cached data
265
+ */
266
+ async clear() {
267
+ this.cache = { version: CACHE_VERSION, players: {} };
268
+ await this.persistCache();
269
+ }
270
+ /**
271
+ * Get cache statistics
272
+ */
273
+ async getStats() {
274
+ await this.loadCache();
275
+ const players = Object.values(this.cache?.players ?? {});
276
+ const timestamps = players.map(p => p.cachedAt);
277
+ let cacheSize = 0;
278
+ try {
279
+ if (existsSync(this.cachePath)) {
280
+ cacheSize = statSync(this.cachePath).size;
281
+ }
282
+ }
283
+ catch {
284
+ // Ignore stat errors
285
+ }
286
+ return {
287
+ playerCount: players.length,
288
+ oldestEntry: timestamps.length > 0 ? Math.min(...timestamps) : null,
289
+ newestEntry: timestamps.length > 0 ? Math.max(...timestamps) : null,
290
+ cacheSize,
291
+ };
292
+ }
293
+ }
294
+ // Singleton instance
295
+ let playerCache = null;
296
+ export function getPlayerCache(cacheDir) {
297
+ if (!playerCache) {
298
+ playerCache = new PlayerCache(cacheDir);
299
+ }
300
+ return playerCache;
301
+ }
302
+ //# sourceMappingURL=player-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-cache.js","sourceRoot":"","sources":["../../src/lib/player-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Player entry in Minecraft JSON files (whitelist.json, ops.json, etc.)
3
+ */
4
+ export interface PlayerEntry {
5
+ uuid: string;
6
+ name: string;
7
+ }
8
+ /**
9
+ * Banned player entry
10
+ */
11
+ export interface BannedPlayerEntry {
12
+ uuid: string;
13
+ name: string;
14
+ created: string;
15
+ source: string;
16
+ expires: string;
17
+ reason: string;
18
+ }
19
+ /**
20
+ * Banned IP entry
21
+ */
22
+ export interface BannedIpEntry {
23
+ ip: string;
24
+ created: string;
25
+ source: string;
26
+ expires: string;
27
+ reason: string;
28
+ }
29
+ /**
30
+ * Read player JSON file (whitelist.json, ops.json)
31
+ */
32
+ export declare function readPlayerJson(path: string): Promise<PlayerEntry[]>;
33
+ /**
34
+ * Write player JSON file
35
+ */
36
+ export declare function writePlayerJson(path: string, entries: PlayerEntry[]): Promise<void>;
37
+ /**
38
+ * Read banned players JSON file
39
+ */
40
+ export declare function readBannedPlayersJson(path: string): Promise<BannedPlayerEntry[]>;
41
+ /**
42
+ * Write banned players JSON file
43
+ */
44
+ export declare function writeBannedPlayersJson(path: string, entries: BannedPlayerEntry[]): Promise<void>;
45
+ /**
46
+ * Read banned IPs JSON file
47
+ */
48
+ export declare function readBannedIpsJson(path: string): Promise<BannedIpEntry[]>;
49
+ /**
50
+ * Write banned IPs JSON file
51
+ */
52
+ export declare function writeBannedIpsJson(path: string, entries: BannedIpEntry[]): Promise<void>;
53
+ /**
54
+ * Find player by name in entries (case-insensitive)
55
+ */
56
+ export declare function findPlayerByName(entries: PlayerEntry[], name: string): PlayerEntry | undefined;
57
+ /**
58
+ * Find banned player by name (case-insensitive)
59
+ */
60
+ export declare function findBannedPlayerByName(entries: BannedPlayerEntry[], name: string): BannedPlayerEntry | undefined;
61
+ /**
62
+ * Find banned IP
63
+ */
64
+ export declare function findBannedIp(entries: BannedIpEntry[], ip: string): BannedIpEntry | undefined;
65
+ /**
66
+ * Create ISO timestamp string
67
+ */
68
+ export declare function createTimestamp(): string;
69
+ //# sourceMappingURL=player-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-json.d.ts","sourceRoot":"","sources":["../../src/lib/player-json.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAYzE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAYtF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE9F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAAE,EAC5B,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE5F;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -0,0 +1,96 @@
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ /**
4
+ * Read player JSON file (whitelist.json, ops.json)
5
+ */
6
+ export async function readPlayerJson(path) {
7
+ if (!existsSync(path)) {
8
+ return [];
9
+ }
10
+ try {
11
+ const content = await readFile(path, 'utf-8');
12
+ const data = JSON.parse(content);
13
+ return Array.isArray(data) ? data : [];
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ }
19
+ /**
20
+ * Write player JSON file
21
+ */
22
+ export async function writePlayerJson(path, entries) {
23
+ const content = JSON.stringify(entries, null, 2);
24
+ await writeFile(path, content, 'utf-8');
25
+ }
26
+ /**
27
+ * Read banned players JSON file
28
+ */
29
+ export async function readBannedPlayersJson(path) {
30
+ if (!existsSync(path)) {
31
+ return [];
32
+ }
33
+ try {
34
+ const content = await readFile(path, 'utf-8');
35
+ const data = JSON.parse(content);
36
+ return Array.isArray(data) ? data : [];
37
+ }
38
+ catch {
39
+ return [];
40
+ }
41
+ }
42
+ /**
43
+ * Write banned players JSON file
44
+ */
45
+ export async function writeBannedPlayersJson(path, entries) {
46
+ const content = JSON.stringify(entries, null, 2);
47
+ await writeFile(path, content, 'utf-8');
48
+ }
49
+ /**
50
+ * Read banned IPs JSON file
51
+ */
52
+ export async function readBannedIpsJson(path) {
53
+ if (!existsSync(path)) {
54
+ return [];
55
+ }
56
+ try {
57
+ const content = await readFile(path, 'utf-8');
58
+ const data = JSON.parse(content);
59
+ return Array.isArray(data) ? data : [];
60
+ }
61
+ catch {
62
+ return [];
63
+ }
64
+ }
65
+ /**
66
+ * Write banned IPs JSON file
67
+ */
68
+ export async function writeBannedIpsJson(path, entries) {
69
+ const content = JSON.stringify(entries, null, 2);
70
+ await writeFile(path, content, 'utf-8');
71
+ }
72
+ /**
73
+ * Find player by name in entries (case-insensitive)
74
+ */
75
+ export function findPlayerByName(entries, name) {
76
+ return entries.find((entry) => entry.name.toLowerCase() === name.toLowerCase());
77
+ }
78
+ /**
79
+ * Find banned player by name (case-insensitive)
80
+ */
81
+ export function findBannedPlayerByName(entries, name) {
82
+ return entries.find((entry) => entry.name.toLowerCase() === name.toLowerCase());
83
+ }
84
+ /**
85
+ * Find banned IP
86
+ */
87
+ export function findBannedIp(entries, ip) {
88
+ return entries.find((entry) => entry.ip === ip);
89
+ }
90
+ /**
91
+ * Create ISO timestamp string
92
+ */
93
+ export function createTimestamp() {
94
+ return new Date().toISOString().replace('T', ' ').replace('Z', ' +0000');
95
+ }
96
+ //# sourceMappingURL=player-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-json.js","sourceRoot":"","sources":["../../src/lib/player-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * PM2 Utility Functions
3
+ *
4
+ * Helper functions for PM2 operations including:
5
+ * - PM2 installation check
6
+ * - PM2 connection management
7
+ * - Ecosystem config path resolution
8
+ */
9
+ import { Paths } from '@minecraft-docker/shared';
10
+ /**
11
+ * Default ecosystem config filename
12
+ */
13
+ export declare const ECOSYSTEM_CONFIG_FILE = "ecosystem.config.cjs";
14
+ /**
15
+ * PM2 service names
16
+ */
17
+ export declare const PM2_SERVICE_NAMES: {
18
+ readonly API: "mcctl-api";
19
+ readonly CONSOLE: "mcctl-console";
20
+ };
21
+ /**
22
+ * Check if PM2 is installed (globally or as a dependency)
23
+ * @returns Object with installation status and version
24
+ */
25
+ export declare function checkPm2Installation(): {
26
+ installed: boolean;
27
+ path?: string;
28
+ version?: string;
29
+ };
30
+ /**
31
+ * Get the ecosystem config path for the given platform
32
+ * @param paths - Paths instance
33
+ * @returns Absolute path to ecosystem.config.cjs
34
+ */
35
+ export declare function getEcosystemConfigPath(paths: Paths): string;
36
+ /**
37
+ * Check if ecosystem config exists
38
+ * @param paths - Paths instance
39
+ * @returns true if config exists
40
+ */
41
+ export declare function ecosystemConfigExists(paths: Paths): boolean;
42
+ /**
43
+ * Get PM2 log file paths for a service
44
+ * @param paths - Paths instance
45
+ * @param serviceName - Service name
46
+ * @returns Object with output and error log paths
47
+ */
48
+ export declare function getPm2LogPaths(paths: Paths, serviceName: string): {
49
+ output: string;
50
+ error: string;
51
+ };
52
+ /**
53
+ * Read log file content
54
+ * @param logPath - Path to log file
55
+ * @param lines - Number of lines to read (default: 100)
56
+ * @returns Log content
57
+ */
58
+ export declare function readLogFile(logPath: string, lines?: number): string;
59
+ /**
60
+ * Format PM2 error for user-friendly display
61
+ * @param error - Error object
62
+ * @returns Formatted error message
63
+ */
64
+ export declare function formatPm2Error(error: unknown): string;
65
+ /**
66
+ * Parse PM2 status to our ServiceStatusEnum
67
+ * @param pm2Status - PM2 process status string
68
+ * @returns Normalized status string
69
+ */
70
+ export declare function normalizePm2Status(pm2Status: string): string;
71
+ //# sourceMappingURL=pm2-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pm2-utils.d.ts","sourceRoot":"","sources":["../../src/lib/pm2-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,qBAAqB,yBAAyB,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAmC9F;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAMnC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,MAAM,CAaxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAerD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmB5D"}