@minecraft-docker/shared 1.5.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application/index.d.ts +3 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +5 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/ports/inbound/IBackupUseCase.d.ts +69 -0
- package/dist/application/ports/inbound/IBackupUseCase.d.ts.map +1 -0
- package/dist/application/ports/inbound/IBackupUseCase.js +2 -0
- package/dist/application/ports/inbound/IBackupUseCase.js.map +1 -0
- package/dist/application/ports/inbound/ICreateServerUseCase.d.ts +32 -0
- package/dist/application/ports/inbound/ICreateServerUseCase.d.ts.map +1 -0
- package/dist/application/ports/inbound/ICreateServerUseCase.js +2 -0
- package/dist/application/ports/inbound/ICreateServerUseCase.js.map +1 -0
- package/dist/application/ports/inbound/IDeleteServerUseCase.d.ts +26 -0
- package/dist/application/ports/inbound/IDeleteServerUseCase.d.ts.map +1 -0
- package/dist/application/ports/inbound/IDeleteServerUseCase.js +2 -0
- package/dist/application/ports/inbound/IDeleteServerUseCase.js.map +1 -0
- package/dist/application/ports/inbound/IPlayerLookupUseCase.d.ts +47 -0
- package/dist/application/ports/inbound/IPlayerLookupUseCase.d.ts.map +1 -0
- package/dist/application/ports/inbound/IPlayerLookupUseCase.js +2 -0
- package/dist/application/ports/inbound/IPlayerLookupUseCase.js.map +1 -0
- package/dist/application/ports/inbound/IServerStatusUseCase.d.ts +34 -0
- package/dist/application/ports/inbound/IServerStatusUseCase.d.ts.map +1 -0
- package/dist/application/ports/inbound/IServerStatusUseCase.js +2 -0
- package/dist/application/ports/inbound/IServerStatusUseCase.js.map +1 -0
- package/dist/application/ports/inbound/IWorldManagementUseCase.d.ts +56 -0
- package/dist/application/ports/inbound/IWorldManagementUseCase.d.ts.map +1 -0
- package/dist/application/ports/inbound/IWorldManagementUseCase.js +2 -0
- package/dist/application/ports/inbound/IWorldManagementUseCase.js.map +1 -0
- package/dist/application/ports/inbound/index.d.ts +7 -0
- package/dist/application/ports/inbound/index.d.ts.map +1 -0
- package/dist/application/ports/inbound/index.js +2 -0
- package/dist/application/ports/inbound/index.js.map +1 -0
- package/dist/application/ports/index.d.ts +3 -0
- package/dist/application/ports/index.d.ts.map +1 -0
- package/dist/application/ports/index.js +2 -0
- package/dist/application/ports/index.js.map +1 -0
- package/dist/application/ports/outbound/IDocProvider.d.ts +73 -0
- package/dist/application/ports/outbound/IDocProvider.d.ts.map +1 -0
- package/dist/application/ports/outbound/IDocProvider.js +2 -0
- package/dist/application/ports/outbound/IDocProvider.js.map +1 -0
- package/dist/application/ports/outbound/IPromptPort.d.ts +136 -0
- package/dist/application/ports/outbound/IPromptPort.d.ts.map +1 -0
- package/dist/application/ports/outbound/IPromptPort.js +2 -0
- package/dist/application/ports/outbound/IPromptPort.js.map +1 -0
- package/dist/application/ports/outbound/IServerRepository.d.ts +54 -0
- package/dist/application/ports/outbound/IServerRepository.d.ts.map +1 -0
- package/dist/application/ports/outbound/IServerRepository.js +2 -0
- package/dist/application/ports/outbound/IServerRepository.js.map +1 -0
- package/dist/application/ports/outbound/IShellPort.d.ts +106 -0
- package/dist/application/ports/outbound/IShellPort.d.ts.map +1 -0
- package/dist/application/ports/outbound/IShellPort.js +2 -0
- package/dist/application/ports/outbound/IShellPort.js.map +1 -0
- package/dist/application/ports/outbound/IWorldRepository.d.ts +71 -0
- package/dist/application/ports/outbound/IWorldRepository.d.ts.map +1 -0
- package/dist/application/ports/outbound/IWorldRepository.js +2 -0
- package/dist/application/ports/outbound/IWorldRepository.js.map +1 -0
- package/dist/application/ports/outbound/index.d.ts +6 -0
- package/dist/application/ports/outbound/index.d.ts.map +1 -0
- package/dist/application/ports/outbound/index.js +2 -0
- package/dist/application/ports/outbound/index.js.map +1 -0
- package/dist/application/use-cases/BackupUseCase.d.ts +35 -0
- package/dist/application/use-cases/BackupUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/BackupUseCase.js +222 -0
- package/dist/application/use-cases/BackupUseCase.js.map +1 -0
- package/dist/application/use-cases/CreateServerUseCase.d.ts +22 -0
- package/dist/application/use-cases/CreateServerUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/CreateServerUseCase.js +145 -0
- package/dist/application/use-cases/CreateServerUseCase.js.map +1 -0
- package/dist/application/use-cases/DeleteServerUseCase.d.ts +24 -0
- package/dist/application/use-cases/DeleteServerUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/DeleteServerUseCase.js +108 -0
- package/dist/application/use-cases/DeleteServerUseCase.js.map +1 -0
- package/dist/application/use-cases/PlayerLookupUseCase.d.ts +23 -0
- package/dist/application/use-cases/PlayerLookupUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/PlayerLookupUseCase.js +130 -0
- package/dist/application/use-cases/PlayerLookupUseCase.js.map +1 -0
- package/dist/application/use-cases/ServerStatusUseCase.d.ts +30 -0
- package/dist/application/use-cases/ServerStatusUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/ServerStatusUseCase.js +117 -0
- package/dist/application/use-cases/ServerStatusUseCase.js.map +1 -0
- package/dist/application/use-cases/WorldManagementUseCase.d.ts +33 -0
- package/dist/application/use-cases/WorldManagementUseCase.d.ts.map +1 -0
- package/dist/application/use-cases/WorldManagementUseCase.js +239 -0
- package/dist/application/use-cases/WorldManagementUseCase.js.map +1 -0
- package/dist/application/use-cases/index.d.ts +7 -0
- package/dist/application/use-cases/index.d.ts.map +1 -0
- package/dist/application/use-cases/index.js +7 -0
- package/dist/application/use-cases/index.js.map +1 -0
- package/dist/docker/index.d.ts +111 -0
- package/dist/docker/index.d.ts.map +1 -0
- package/dist/docker/index.js +532 -0
- package/dist/docker/index.js.map +1 -0
- package/dist/domain/entities/Server.d.ts +77 -0
- package/dist/domain/entities/Server.d.ts.map +1 -0
- package/dist/domain/entities/Server.js +138 -0
- package/dist/domain/entities/Server.js.map +1 -0
- package/dist/domain/entities/World.d.ts +70 -0
- package/dist/domain/entities/World.d.ts.map +1 -0
- package/dist/domain/entities/World.js +128 -0
- package/dist/domain/entities/World.js.map +1 -0
- package/dist/domain/entities/index.d.ts +3 -0
- package/dist/domain/entities/index.d.ts.map +1 -0
- package/dist/domain/entities/index.js +3 -0
- package/dist/domain/entities/index.js.map +1 -0
- package/dist/domain/index.d.ts +3 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +5 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/value-objects/McVersion.d.ts +35 -0
- package/dist/domain/value-objects/McVersion.d.ts.map +1 -0
- package/dist/domain/value-objects/McVersion.js +117 -0
- package/dist/domain/value-objects/McVersion.js.map +1 -0
- package/dist/domain/value-objects/Memory.d.ts +37 -0
- package/dist/domain/value-objects/Memory.d.ts.map +1 -0
- package/dist/domain/value-objects/Memory.js +107 -0
- package/dist/domain/value-objects/Memory.js.map +1 -0
- package/dist/domain/value-objects/ServerName.d.ts +21 -0
- package/dist/domain/value-objects/ServerName.d.ts.map +1 -0
- package/dist/domain/value-objects/ServerName.js +58 -0
- package/dist/domain/value-objects/ServerName.js.map +1 -0
- package/dist/domain/value-objects/ServerType.d.ts +39 -0
- package/dist/domain/value-objects/ServerType.d.ts.map +1 -0
- package/dist/domain/value-objects/ServerType.js +128 -0
- package/dist/domain/value-objects/ServerType.js.map +1 -0
- package/dist/domain/value-objects/WorldOptions.d.ts +49 -0
- package/dist/domain/value-objects/WorldOptions.d.ts.map +1 -0
- package/dist/domain/value-objects/WorldOptions.js +149 -0
- package/dist/domain/value-objects/WorldOptions.js.map +1 -0
- package/dist/domain/value-objects/index.d.ts +6 -0
- package/dist/domain/value-objects/index.d.ts.map +1 -0
- package/dist/domain/value-objects/index.js +6 -0
- package/dist/domain/value-objects/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/DocsAdapter.d.ts +45 -0
- package/dist/infrastructure/adapters/DocsAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/DocsAdapter.js +490 -0
- package/dist/infrastructure/adapters/DocsAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/ServerRepository.d.ts +49 -0
- package/dist/infrastructure/adapters/ServerRepository.d.ts.map +1 -0
- package/dist/infrastructure/adapters/ServerRepository.js +206 -0
- package/dist/infrastructure/adapters/ServerRepository.js.map +1 -0
- package/dist/infrastructure/adapters/ShellAdapter.d.ts +39 -0
- package/dist/infrastructure/adapters/ShellAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/ShellAdapter.js +188 -0
- package/dist/infrastructure/adapters/ShellAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/WorldRepository.d.ts +55 -0
- package/dist/infrastructure/adapters/WorldRepository.d.ts.map +1 -0
- package/dist/infrastructure/adapters/WorldRepository.js +213 -0
- package/dist/infrastructure/adapters/WorldRepository.js.map +1 -0
- package/dist/infrastructure/adapters/index.d.ts +9 -0
- package/dist/infrastructure/adapters/index.d.ts.map +1 -0
- package/dist/infrastructure/adapters/index.js +9 -0
- package/dist/infrastructure/adapters/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +6 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +6 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/types/index.d.ts +151 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +81 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +200 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
import { spawn, execSync, spawnSync } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Execute a command and return stdout
|
|
4
|
+
* Uses spawnSync to properly handle arguments with special characters
|
|
5
|
+
*/
|
|
6
|
+
function execCommand(command, args) {
|
|
7
|
+
try {
|
|
8
|
+
const result = spawnSync(command, args, {
|
|
9
|
+
encoding: 'utf-8',
|
|
10
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
11
|
+
});
|
|
12
|
+
if (result.error || result.status !== 0) {
|
|
13
|
+
return '';
|
|
14
|
+
}
|
|
15
|
+
return (result.stdout ?? '').trim();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check if Docker is available
|
|
23
|
+
*/
|
|
24
|
+
export function checkDocker() {
|
|
25
|
+
try {
|
|
26
|
+
execSync('docker info', { stdio: 'pipe' });
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Check if Docker Compose is available
|
|
35
|
+
*/
|
|
36
|
+
export function checkDockerCompose() {
|
|
37
|
+
try {
|
|
38
|
+
execSync('docker compose version', { stdio: 'pipe' });
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get container status
|
|
47
|
+
*/
|
|
48
|
+
export function getContainerStatus(container) {
|
|
49
|
+
const result = execCommand('docker', [
|
|
50
|
+
'inspect',
|
|
51
|
+
'--format',
|
|
52
|
+
'{{.State.Status}}',
|
|
53
|
+
container,
|
|
54
|
+
]);
|
|
55
|
+
if (!result)
|
|
56
|
+
return 'not_found';
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get container health status
|
|
61
|
+
*/
|
|
62
|
+
export function getContainerHealth(container) {
|
|
63
|
+
const result = execCommand('docker', [
|
|
64
|
+
'inspect',
|
|
65
|
+
'--format',
|
|
66
|
+
'{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}',
|
|
67
|
+
container,
|
|
68
|
+
]);
|
|
69
|
+
if (!result)
|
|
70
|
+
return 'unknown';
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check mc-router health via management API
|
|
75
|
+
* mc-router uses distroless image, so Docker healthcheck doesn't work
|
|
76
|
+
* Instead, we check the management API on localhost:25580
|
|
77
|
+
*/
|
|
78
|
+
export function getRouterHealthViaApi() {
|
|
79
|
+
try {
|
|
80
|
+
// Check if mc-router is running first
|
|
81
|
+
const status = getContainerStatus('mc-router');
|
|
82
|
+
if (status !== 'running') {
|
|
83
|
+
return 'unknown';
|
|
84
|
+
}
|
|
85
|
+
// Try to connect to management API
|
|
86
|
+
const result = spawnSync('curl', ['-s', '-o', '/dev/null', '-w', '%{http_code}', 'http://127.0.0.1:25580/routes'], {
|
|
87
|
+
encoding: 'utf-8',
|
|
88
|
+
timeout: 3000,
|
|
89
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
90
|
+
});
|
|
91
|
+
if (result.error || result.status !== 0) {
|
|
92
|
+
// curl failed, try wget
|
|
93
|
+
const wgetResult = spawnSync('wget', ['-q', '-O', '/dev/null', 'http://127.0.0.1:25580/routes'], {
|
|
94
|
+
encoding: 'utf-8',
|
|
95
|
+
timeout: 3000,
|
|
96
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
97
|
+
});
|
|
98
|
+
if (wgetResult.error || wgetResult.status !== 0) {
|
|
99
|
+
return 'unhealthy';
|
|
100
|
+
}
|
|
101
|
+
return 'healthy';
|
|
102
|
+
}
|
|
103
|
+
const httpCode = (result.stdout ?? '').trim();
|
|
104
|
+
if (httpCode === '200') {
|
|
105
|
+
return 'healthy';
|
|
106
|
+
}
|
|
107
|
+
return 'unhealthy';
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return 'unknown';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check if container exists
|
|
115
|
+
*/
|
|
116
|
+
export function containerExists(container) {
|
|
117
|
+
try {
|
|
118
|
+
execSync(`docker inspect ${container}`, { stdio: 'pipe' });
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get container's hostname label (mc-router.host)
|
|
127
|
+
*/
|
|
128
|
+
export function getContainerHostname(container) {
|
|
129
|
+
const result = execCommand('docker', [
|
|
130
|
+
'inspect',
|
|
131
|
+
'--format',
|
|
132
|
+
'{{index .Config.Labels "mc-router.host"}}',
|
|
133
|
+
container,
|
|
134
|
+
]);
|
|
135
|
+
return result || '-';
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get all minecraft server containers (mc-* except mc-router)
|
|
139
|
+
*/
|
|
140
|
+
export function getMcContainers() {
|
|
141
|
+
const result = execCommand('docker', [
|
|
142
|
+
'ps',
|
|
143
|
+
'-a',
|
|
144
|
+
'--filter',
|
|
145
|
+
'name=mc-',
|
|
146
|
+
'--format',
|
|
147
|
+
'{{.Names}}',
|
|
148
|
+
]);
|
|
149
|
+
if (!result)
|
|
150
|
+
return [];
|
|
151
|
+
return result
|
|
152
|
+
.split('\n')
|
|
153
|
+
.filter(name => name && name !== 'mc-router')
|
|
154
|
+
.sort();
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get running minecraft server containers
|
|
158
|
+
*/
|
|
159
|
+
export function getRunningMcContainers() {
|
|
160
|
+
const result = execCommand('docker', [
|
|
161
|
+
'ps',
|
|
162
|
+
'--filter',
|
|
163
|
+
'name=mc-',
|
|
164
|
+
'--filter',
|
|
165
|
+
'status=running',
|
|
166
|
+
'--format',
|
|
167
|
+
'{{.Names}}',
|
|
168
|
+
]);
|
|
169
|
+
if (!result)
|
|
170
|
+
return [];
|
|
171
|
+
return result
|
|
172
|
+
.split('\n')
|
|
173
|
+
.filter(name => name && name !== 'mc-router')
|
|
174
|
+
.sort();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get server info for a container
|
|
178
|
+
*/
|
|
179
|
+
export function getServerInfo(container) {
|
|
180
|
+
const serverName = container.replace(/^mc-/, '');
|
|
181
|
+
return {
|
|
182
|
+
name: serverName,
|
|
183
|
+
container,
|
|
184
|
+
status: getContainerStatus(container),
|
|
185
|
+
health: getContainerHealth(container),
|
|
186
|
+
hostname: getContainerHostname(container),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get router info
|
|
191
|
+
*/
|
|
192
|
+
export function getRouterInfo() {
|
|
193
|
+
return {
|
|
194
|
+
name: 'mc-router',
|
|
195
|
+
status: getContainerStatus('mc-router'),
|
|
196
|
+
health: getRouterHealthViaApi(),
|
|
197
|
+
port: 25565,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get avahi-daemon status
|
|
202
|
+
*/
|
|
203
|
+
export function getAvahiStatus() {
|
|
204
|
+
// Try systemctl first
|
|
205
|
+
try {
|
|
206
|
+
execSync('systemctl is-active --quiet avahi-daemon', { stdio: 'pipe' });
|
|
207
|
+
return 'running';
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Not running via systemctl
|
|
211
|
+
}
|
|
212
|
+
// Try OpenRC
|
|
213
|
+
try {
|
|
214
|
+
execSync('rc-service avahi-daemon status', { stdio: 'pipe' });
|
|
215
|
+
return 'running';
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Not running via OpenRC
|
|
219
|
+
}
|
|
220
|
+
// Check if installed
|
|
221
|
+
try {
|
|
222
|
+
execSync('which avahi-daemon', { stdio: 'pipe' });
|
|
223
|
+
return 'installed (not running)';
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return 'not installed';
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get full platform status
|
|
231
|
+
*/
|
|
232
|
+
export function getPlatformStatus() {
|
|
233
|
+
const containers = getMcContainers();
|
|
234
|
+
return {
|
|
235
|
+
router: getRouterInfo(),
|
|
236
|
+
avahi_daemon: {
|
|
237
|
+
name: 'avahi-daemon',
|
|
238
|
+
status: getAvahiStatus(),
|
|
239
|
+
type: 'system',
|
|
240
|
+
},
|
|
241
|
+
servers: containers.map(getServerInfo),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Start a container
|
|
246
|
+
*/
|
|
247
|
+
export function startContainer(container) {
|
|
248
|
+
try {
|
|
249
|
+
execSync(`docker start ${container}`, { stdio: 'pipe' });
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Stop a container
|
|
258
|
+
*/
|
|
259
|
+
export function stopContainer(container) {
|
|
260
|
+
try {
|
|
261
|
+
execSync(`docker stop ${container}`, { stdio: 'pipe' });
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get container logs
|
|
270
|
+
*/
|
|
271
|
+
export function getContainerLogs(container, lines = 50) {
|
|
272
|
+
return execCommand('docker', ['logs', '--tail', String(lines), container]);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Execute shell script with environment variables
|
|
276
|
+
*/
|
|
277
|
+
export function execScript(scriptPath, args, env = {}) {
|
|
278
|
+
return new Promise((resolve) => {
|
|
279
|
+
const child = spawn('bash', [scriptPath, ...args], {
|
|
280
|
+
env: { ...process.env, ...env },
|
|
281
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
282
|
+
});
|
|
283
|
+
let stdout = '';
|
|
284
|
+
let stderr = '';
|
|
285
|
+
child.stdout?.on('data', (data) => {
|
|
286
|
+
stdout += data.toString();
|
|
287
|
+
process.stdout.write(data);
|
|
288
|
+
});
|
|
289
|
+
child.stderr?.on('data', (data) => {
|
|
290
|
+
stderr += data.toString();
|
|
291
|
+
process.stderr.write(data);
|
|
292
|
+
});
|
|
293
|
+
child.on('close', (code) => {
|
|
294
|
+
resolve({ code: code ?? 1, stdout, stderr });
|
|
295
|
+
});
|
|
296
|
+
child.on('error', () => {
|
|
297
|
+
resolve({ code: 1, stdout, stderr: 'Failed to execute script' });
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Execute shell script with inherited stdio (interactive)
|
|
303
|
+
*/
|
|
304
|
+
export function execScriptInteractive(scriptPath, args, env = {}) {
|
|
305
|
+
return new Promise((resolve) => {
|
|
306
|
+
const child = spawn('bash', [scriptPath, ...args], {
|
|
307
|
+
env: { ...process.env, ...env },
|
|
308
|
+
stdio: 'inherit',
|
|
309
|
+
});
|
|
310
|
+
child.on('close', (code) => {
|
|
311
|
+
resolve(code ?? 1);
|
|
312
|
+
});
|
|
313
|
+
child.on('error', () => {
|
|
314
|
+
resolve(1);
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get container resource stats (memory, CPU)
|
|
320
|
+
*/
|
|
321
|
+
export function getContainerStats(container) {
|
|
322
|
+
// docker stats --no-stream --format "{{.MemUsage}},{{.CPUPerc}}"
|
|
323
|
+
// Example output: "2.1GiB / 4GiB,15.23%"
|
|
324
|
+
const result = execCommand('docker', [
|
|
325
|
+
'stats',
|
|
326
|
+
'--no-stream',
|
|
327
|
+
'--format',
|
|
328
|
+
'{{.MemUsage}},{{.CPUPerc}}',
|
|
329
|
+
container,
|
|
330
|
+
]);
|
|
331
|
+
if (!result)
|
|
332
|
+
return null;
|
|
333
|
+
try {
|
|
334
|
+
const [memUsage, cpuPerc] = result.split(',');
|
|
335
|
+
if (!memUsage || !cpuPerc)
|
|
336
|
+
return null;
|
|
337
|
+
// Parse memory: "2.1GiB / 4GiB" or "512MiB / 4GiB"
|
|
338
|
+
const memParts = memUsage.split('/').map((s) => s.trim());
|
|
339
|
+
if (memParts.length !== 2)
|
|
340
|
+
return null;
|
|
341
|
+
const parseMemory = (mem) => {
|
|
342
|
+
const match = mem.match(/^([\d.]+)\s*(B|KiB|MiB|GiB|TiB|KB|MB|GB|TB)?$/i);
|
|
343
|
+
if (!match || !match[1])
|
|
344
|
+
return 0;
|
|
345
|
+
const value = parseFloat(match[1]);
|
|
346
|
+
const unit = (match[2] ?? 'B').toUpperCase();
|
|
347
|
+
const multipliers = {
|
|
348
|
+
B: 1,
|
|
349
|
+
KIB: 1024,
|
|
350
|
+
MIB: 1024 ** 2,
|
|
351
|
+
GIB: 1024 ** 3,
|
|
352
|
+
TIB: 1024 ** 4,
|
|
353
|
+
KB: 1000,
|
|
354
|
+
MB: 1000 ** 2,
|
|
355
|
+
GB: 1000 ** 3,
|
|
356
|
+
TB: 1000 ** 4,
|
|
357
|
+
};
|
|
358
|
+
return value * (multipliers[unit] || 1);
|
|
359
|
+
};
|
|
360
|
+
const memoryUsage = parseMemory(memParts[0]);
|
|
361
|
+
const memoryLimit = parseMemory(memParts[1]);
|
|
362
|
+
const memoryPercent = memoryLimit > 0 ? (memoryUsage / memoryLimit) * 100 : 0;
|
|
363
|
+
// Parse CPU: "15.23%" or "0.00%"
|
|
364
|
+
const cpuPercent = parseFloat(cpuPerc.replace('%', '')) || 0;
|
|
365
|
+
return {
|
|
366
|
+
memoryUsage,
|
|
367
|
+
memoryLimit,
|
|
368
|
+
memoryPercent,
|
|
369
|
+
cpuPercent,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Get container uptime (time since start)
|
|
378
|
+
*/
|
|
379
|
+
export function getContainerUptime(container) {
|
|
380
|
+
// docker inspect --format '{{.State.StartedAt}}'
|
|
381
|
+
const result = execCommand('docker', [
|
|
382
|
+
'inspect',
|
|
383
|
+
'--format',
|
|
384
|
+
'{{.State.StartedAt}}',
|
|
385
|
+
container,
|
|
386
|
+
]);
|
|
387
|
+
if (!result || result === '0001-01-01T00:00:00Z')
|
|
388
|
+
return null;
|
|
389
|
+
try {
|
|
390
|
+
const startedAt = new Date(result);
|
|
391
|
+
const now = new Date();
|
|
392
|
+
const diffMs = now.getTime() - startedAt.getTime();
|
|
393
|
+
const diffSeconds = Math.floor(diffMs / 1000);
|
|
394
|
+
// Format uptime
|
|
395
|
+
const days = Math.floor(diffSeconds / 86400);
|
|
396
|
+
const hours = Math.floor((diffSeconds % 86400) / 3600);
|
|
397
|
+
const minutes = Math.floor((diffSeconds % 3600) / 60);
|
|
398
|
+
let uptime = '';
|
|
399
|
+
if (days > 0)
|
|
400
|
+
uptime += `${days}d `;
|
|
401
|
+
if (hours > 0 || days > 0)
|
|
402
|
+
uptime += `${hours}h `;
|
|
403
|
+
uptime += `${minutes}m`;
|
|
404
|
+
return { uptime: uptime.trim(), seconds: diffSeconds };
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Get online players via RCON
|
|
412
|
+
*/
|
|
413
|
+
export async function getOnlinePlayers(container) {
|
|
414
|
+
try {
|
|
415
|
+
const result = execSync(`docker exec ${container} rcon-cli list`, {
|
|
416
|
+
encoding: 'utf-8',
|
|
417
|
+
timeout: 5000,
|
|
418
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
419
|
+
});
|
|
420
|
+
// Parse: "There are 3 of a max of 20 players online: Notch, Steve, Alex"
|
|
421
|
+
// Or: "There are 0 of a max of 20 players online:"
|
|
422
|
+
const countMatch = result.match(/There are (\d+)(?:\s+of a max of\s+|\/)(\d+) players? online/i);
|
|
423
|
+
if (!countMatch || !countMatch[1] || !countMatch[2])
|
|
424
|
+
return null;
|
|
425
|
+
const online = parseInt(countMatch[1], 10);
|
|
426
|
+
const max = parseInt(countMatch[2], 10);
|
|
427
|
+
// Extract player names after the colon
|
|
428
|
+
const playersMatch = result.match(/:\s*(.*)$/);
|
|
429
|
+
let players = [];
|
|
430
|
+
if (playersMatch && playersMatch[1]) {
|
|
431
|
+
players = playersMatch[1]
|
|
432
|
+
.split(',')
|
|
433
|
+
.map((s) => s.trim())
|
|
434
|
+
.filter(Boolean);
|
|
435
|
+
}
|
|
436
|
+
return { online, max, players };
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Get detailed server info
|
|
444
|
+
*/
|
|
445
|
+
export function getDetailedServerInfo(container, configEnv) {
|
|
446
|
+
const basic = getServerInfo(container);
|
|
447
|
+
const detailed = { ...basic };
|
|
448
|
+
// Only get extended info if container is running
|
|
449
|
+
if (basic.status === 'running') {
|
|
450
|
+
// Get stats
|
|
451
|
+
const stats = getContainerStats(container);
|
|
452
|
+
if (stats) {
|
|
453
|
+
detailed.stats = stats;
|
|
454
|
+
}
|
|
455
|
+
// Get uptime
|
|
456
|
+
const uptimeInfo = getContainerUptime(container);
|
|
457
|
+
if (uptimeInfo) {
|
|
458
|
+
detailed.uptime = uptimeInfo.uptime;
|
|
459
|
+
detailed.uptimeSeconds = uptimeInfo.seconds;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
// Get config info if provided
|
|
463
|
+
if (configEnv) {
|
|
464
|
+
detailed.type = configEnv['TYPE'];
|
|
465
|
+
detailed.version = configEnv['VERSION'];
|
|
466
|
+
detailed.memory = configEnv['MEMORY'];
|
|
467
|
+
}
|
|
468
|
+
return detailed;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Get detailed server info with players (async)
|
|
472
|
+
*/
|
|
473
|
+
export async function getDetailedServerInfoWithPlayers(container, configEnv) {
|
|
474
|
+
const detailed = getDetailedServerInfo(container, configEnv);
|
|
475
|
+
// Get players if running
|
|
476
|
+
if (detailed.status === 'running') {
|
|
477
|
+
const players = await getOnlinePlayers(container);
|
|
478
|
+
if (players) {
|
|
479
|
+
detailed.players = players;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return detailed;
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Get router detailed info
|
|
486
|
+
*/
|
|
487
|
+
export function getRouterDetailInfo() {
|
|
488
|
+
const basic = getRouterInfo();
|
|
489
|
+
const detailed = {
|
|
490
|
+
...basic,
|
|
491
|
+
routes: [],
|
|
492
|
+
mode: '--in-docker (auto-discovery)',
|
|
493
|
+
};
|
|
494
|
+
// Get uptime
|
|
495
|
+
if (basic.status === 'running') {
|
|
496
|
+
const uptimeInfo = getContainerUptime('mc-router');
|
|
497
|
+
if (uptimeInfo) {
|
|
498
|
+
detailed.uptime = uptimeInfo.uptime;
|
|
499
|
+
detailed.uptimeSeconds = uptimeInfo.seconds;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// Get routes from all mc-* containers
|
|
503
|
+
const containers = getMcContainers();
|
|
504
|
+
for (const container of containers) {
|
|
505
|
+
const hostname = getContainerHostname(container);
|
|
506
|
+
if (hostname && hostname !== '-') {
|
|
507
|
+
// hostname might be comma-separated (e.g., "server.local,server.192.168.1.10.nip.io")
|
|
508
|
+
const hostnames = hostname.split(',').map((h) => h.trim());
|
|
509
|
+
const serverStatus = getContainerStatus(container);
|
|
510
|
+
for (const h of hostnames) {
|
|
511
|
+
detailed.routes.push({
|
|
512
|
+
hostname: h,
|
|
513
|
+
target: `${container}:25565`,
|
|
514
|
+
serverStatus,
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
return detailed;
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Format bytes to human readable string
|
|
523
|
+
*/
|
|
524
|
+
export function formatBytes(bytes) {
|
|
525
|
+
if (bytes === 0)
|
|
526
|
+
return '0 B';
|
|
527
|
+
const k = 1024;
|
|
528
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
529
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
530
|
+
return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
|
|
531
|
+
}
|
|
532
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/docker/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ServerName } from '../value-objects/ServerName.js';
|
|
2
|
+
import { ServerType } from '../value-objects/ServerType.js';
|
|
3
|
+
import { McVersion } from '../value-objects/McVersion.js';
|
|
4
|
+
import { Memory } from '../value-objects/Memory.js';
|
|
5
|
+
import { WorldOptions } from '../value-objects/WorldOptions.js';
|
|
6
|
+
/**
|
|
7
|
+
* Server status enumeration
|
|
8
|
+
*/
|
|
9
|
+
export declare enum ServerStatus {
|
|
10
|
+
RUNNING = "running",
|
|
11
|
+
STOPPED = "stopped",
|
|
12
|
+
STARTING = "starting",
|
|
13
|
+
STOPPING = "stopping",
|
|
14
|
+
ERROR = "error",
|
|
15
|
+
UNKNOWN = "unknown"
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Server configuration interface
|
|
19
|
+
*/
|
|
20
|
+
export interface ServerConfig {
|
|
21
|
+
name: ServerName;
|
|
22
|
+
type: ServerType;
|
|
23
|
+
version: McVersion;
|
|
24
|
+
memory: Memory;
|
|
25
|
+
worldOptions: WorldOptions;
|
|
26
|
+
rconPassword?: string;
|
|
27
|
+
autoStart?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Server entity
|
|
31
|
+
* Represents a Minecraft server instance
|
|
32
|
+
*/
|
|
33
|
+
export declare class Server {
|
|
34
|
+
private readonly _config;
|
|
35
|
+
private _status;
|
|
36
|
+
private _playerCount;
|
|
37
|
+
constructor(config: ServerConfig);
|
|
38
|
+
get name(): ServerName;
|
|
39
|
+
get type(): ServerType;
|
|
40
|
+
get version(): McVersion;
|
|
41
|
+
get memory(): Memory;
|
|
42
|
+
get worldOptions(): WorldOptions;
|
|
43
|
+
get rconPassword(): string | undefined;
|
|
44
|
+
get autoStart(): boolean;
|
|
45
|
+
get status(): ServerStatus;
|
|
46
|
+
get playerCount(): number;
|
|
47
|
+
get isRunning(): boolean;
|
|
48
|
+
get isStopped(): boolean;
|
|
49
|
+
get hasPlayers(): boolean;
|
|
50
|
+
setStatus(status: ServerStatus): void;
|
|
51
|
+
setPlayerCount(count: number): void;
|
|
52
|
+
/**
|
|
53
|
+
* Container name for Docker
|
|
54
|
+
*/
|
|
55
|
+
get containerName(): string;
|
|
56
|
+
/**
|
|
57
|
+
* Hostname for mc-router connection
|
|
58
|
+
*/
|
|
59
|
+
get hostname(): string;
|
|
60
|
+
/**
|
|
61
|
+
* Convert to CLI arguments for create-server.sh
|
|
62
|
+
*/
|
|
63
|
+
toCreateArgs(): string[];
|
|
64
|
+
/**
|
|
65
|
+
* Convert to environment variables for config.env
|
|
66
|
+
*/
|
|
67
|
+
toEnvVars(): Record<string, string>;
|
|
68
|
+
/**
|
|
69
|
+
* Create a new server with the given configuration
|
|
70
|
+
*/
|
|
71
|
+
static create(config: ServerConfig): Server;
|
|
72
|
+
/**
|
|
73
|
+
* Create a minimal server configuration (for listing/status)
|
|
74
|
+
*/
|
|
75
|
+
static fromStatus(name: string, type: string, version: string, status: ServerStatus, playerCount: number): Server;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=Server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Server.d.ts","sourceRoot":"","sources":["../../../src/domain/entities/Server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEhE;;GAEG;AACH,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,YAAY;IAOhC,IAAI,IAAI,IAAI,UAAU,CAErB;IAED,IAAI,IAAI,IAAI,UAAU,CAErB;IAED,IAAI,OAAO,IAAI,SAAS,CAEvB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAGD,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAGD,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIrC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOnC;;OAEG;IACH,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAgBxB;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IASnC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAI3C;;OAEG;IACH,MAAM,CAAC,UAAU,CACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,GAClB,MAAM;CAYV"}
|