@bkm016/calcite 0.1.0 → 0.2.0

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 (53) hide show
  1. package/README.md +113 -11
  2. package/dist/accounts.d.ts +23 -4
  3. package/dist/accounts.js +120 -40
  4. package/dist/accounts.js.map +1 -1
  5. package/dist/cli.js +95 -5
  6. package/dist/cli.js.map +1 -1
  7. package/dist/client-core.d.ts +66 -0
  8. package/dist/client-core.js +530 -0
  9. package/dist/client-core.js.map +1 -0
  10. package/dist/client.d.ts +86 -210
  11. package/dist/client.js +90 -576
  12. package/dist/client.js.map +1 -1
  13. package/dist/display.js +42 -13
  14. package/dist/display.js.map +1 -1
  15. package/dist/hmc.d.ts +31 -11
  16. package/dist/hmc.js +68 -30
  17. package/dist/hmc.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/install.d.ts +48 -0
  21. package/dist/install.js +119 -0
  22. package/dist/install.js.map +1 -0
  23. package/dist/java.d.ts +8 -2
  24. package/dist/java.js +14 -10
  25. package/dist/java.js.map +1 -1
  26. package/dist/loaders.d.ts +41 -0
  27. package/dist/loaders.js +86 -0
  28. package/dist/loaders.js.map +1 -0
  29. package/dist/mcp.js +128 -3
  30. package/dist/mcp.js.map +1 -1
  31. package/dist/mods.d.ts +21 -0
  32. package/dist/mods.js +135 -0
  33. package/dist/mods.js.map +1 -0
  34. package/dist/mojang.d.ts +0 -16
  35. package/dist/mojang.js +1 -37
  36. package/dist/mojang.js.map +1 -1
  37. package/dist/names.d.ts +53 -0
  38. package/dist/names.js +267 -0
  39. package/dist/names.js.map +1 -0
  40. package/dist/net.d.ts +5 -0
  41. package/dist/net.js +41 -1
  42. package/dist/net.js.map +1 -1
  43. package/dist/paths.d.ts +5 -3
  44. package/dist/paths.js +1 -0
  45. package/dist/paths.js.map +1 -1
  46. package/dist/types.d.ts +235 -0
  47. package/dist/types.js +25 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/zip.d.ts +5 -0
  50. package/dist/zip.js +65 -0
  51. package/dist/zip.js.map +1 -0
  52. package/package.json +1 -1
  53. package/vendor/calcite-probe.jar +0 -0
@@ -0,0 +1,530 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { EventEmitter } from 'node:events';
3
+ import { mkdir, rm, writeFile } from 'node:fs/promises';
4
+ import { Socket } from 'node:net';
5
+ import { join } from 'node:path';
6
+ import { prepareAccount, syncAccount } from './accounts.js';
7
+ import { acquireDisplay, which } from './display.js';
8
+ import { hmcListEntry, hmcQuote, hmcVersionArgs, killTree, runHmc, writeHmcProfile } from './hmc.js';
9
+ import { installProbe, prepareGame } from './install.js';
10
+ import { parseLoader } from './loaders.js';
11
+ import { acquireLock } from './lock.js';
12
+ import { logger } from './log.js';
13
+ import { resolveMods, syncMods } from './mods.js';
14
+ import { javaProxyProps } from './net.js';
15
+ import { supportsQuickPlay } from './mojang.js';
16
+ import { defaultOptions, writeOptions } from './options.js';
17
+ import { resolvePaths } from './paths.js';
18
+ import { ProbeError, ProbeServer } from './probe-server.js';
19
+ import { CalciteError, defaultUsername, parseServer, } from './types.js';
20
+ const NAME_RE = /^[A-Za-z0-9_.-]{1,64}$/;
21
+ const MAX_LOG = 5000;
22
+ const MAX_CHAT = 1000;
23
+ /** Escapes a value for a java.util.Properties file. */
24
+ function propValue(value) {
25
+ return value.replace(/\\/g, '\\\\').replace(/[:=]/g, (c) => `\\${c}`);
26
+ }
27
+ async function tcpReachable(host, port, timeoutMs = 3000) {
28
+ return new Promise((resolve) => {
29
+ const socket = new Socket();
30
+ const done = (ok) => {
31
+ socket.destroy();
32
+ resolve(ok);
33
+ };
34
+ socket.setTimeout(timeoutMs, () => done(false));
35
+ socket.once('error', () => done(false));
36
+ socket.connect(port, host, () => done(true));
37
+ });
38
+ }
39
+ /** Screens shown while joining or changing dimension; the player is not playable yet. */
40
+ const LOADING_SCREEN = /LevelLoading|ReceivingLevel|ProgressScreen|ConnectScreen|GenericMessage|DownloadingTerrain/;
41
+ export const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
42
+ /** Process lifecycle of a client: preparing, launching, the probe connection, reconnects and shutdown. */
43
+ export class ClientCore extends EventEmitter {
44
+ options;
45
+ paths;
46
+ gameDir;
47
+ render;
48
+ account;
49
+ server;
50
+ phaseValue = 'idle';
51
+ logs = [];
52
+ chats = [];
53
+ seq = 0;
54
+ probe = null;
55
+ run = null;
56
+ display = null;
57
+ releaseInstance = null;
58
+ probeConfig = null;
59
+ game = null;
60
+ mods = [];
61
+ headlessValue = false;
62
+ lastState;
63
+ lastError;
64
+ /** Error code of a failure that relaunching cannot fix (reported by start() instead of "crashed"). */
65
+ fatalCode;
66
+ startedAt;
67
+ reconnects = 0;
68
+ stopping = false;
69
+ poller = null;
70
+ inGameSince = 0;
71
+ relaunching = false;
72
+ everInGame = false;
73
+ joinRequested = false;
74
+ log;
75
+ constructor(options) {
76
+ super();
77
+ if (!NAME_RE.test(options.name)) {
78
+ throw new CalciteError('bad_name', `Invalid client name "${options.name}" (allowed: letters, digits, - _ .)`);
79
+ }
80
+ this.options = options;
81
+ this.paths = options.paths ?? resolvePaths();
82
+ this.gameDir = join(this.paths.instances, options.name);
83
+ this.render = options.render ?? 'on-demand';
84
+ this.account = options.account ?? { type: 'offline', username: defaultUsername(options.name) };
85
+ if (this.account.type === 'offline' && !/^[A-Za-z0-9_]{3,16}$/.test(this.account.username)) {
86
+ throw new CalciteError('bad_username', `Offline username must be 3-16 letters, digits or underscores: "${this.account.username}"`);
87
+ }
88
+ this.server = options.server ? parseServer(options.server) : undefined;
89
+ if (!parseLoader(options.loader) && options.mods?.length) {
90
+ throw new CalciteError('bad_mod', 'Mods need a mod loader (loader "fabric", "forge" or "neoforge")');
91
+ }
92
+ this.log = logger(`client:${options.name}`);
93
+ this.on('error', () => undefined); // never crash the host process on an unhandled 'error' event
94
+ }
95
+ get phase() {
96
+ return this.phaseValue;
97
+ }
98
+ get headless() {
99
+ return this.headlessValue;
100
+ }
101
+ setPhase(phase) {
102
+ if (phase === this.phaseValue)
103
+ return;
104
+ this.phaseValue = phase;
105
+ this.note(`phase → ${phase}`);
106
+ this.emit('phase', phase);
107
+ }
108
+ note(line) {
109
+ this.pushLog('calcite', line);
110
+ this.log.debug(line);
111
+ }
112
+ pushLog(source, line) {
113
+ const entry = { seq: ++this.seq, time: Date.now(), source, line };
114
+ this.logs.push(entry);
115
+ if (this.logs.length > MAX_LOG)
116
+ this.logs.splice(0, this.logs.length - MAX_LOG);
117
+ this.emit('log', entry);
118
+ if (source === 'game') {
119
+ const chat = /\[CHAT\] (.*)$/.exec(line);
120
+ if (chat) {
121
+ const c = { seq: entry.seq, time: entry.time, message: chat[1] };
122
+ this.chats.push(c);
123
+ if (this.chats.length > MAX_CHAT)
124
+ this.chats.splice(0, this.chats.length - MAX_CHAT);
125
+ this.emit('chat', c);
126
+ }
127
+ }
128
+ }
129
+ // ------------------------------------------------------------------ lifecycle
130
+ /**
131
+ * Prepares everything (Java, game files, mappings), launches the client and resolves once it is in a world
132
+ * (or on the title screen when no server is configured).
133
+ */
134
+ async start() {
135
+ if (!['idle', 'stopped', 'crashed'].includes(this.phaseValue)) {
136
+ throw new CalciteError('already_running', `Client "${this.options.name}" is already ${this.phaseValue}`);
137
+ }
138
+ this.stopping = false;
139
+ this.everInGame = false;
140
+ this.reconnects = 0;
141
+ this.lastError = undefined;
142
+ this.fatalCode = undefined;
143
+ const timeout = this.options.startTimeoutMs ?? 15 * 60_000;
144
+ try {
145
+ this.releaseInstance = await acquireLock(join(this.gameDir, '.calcite.lock'), { timeoutMs: 0 });
146
+ }
147
+ catch {
148
+ throw new CalciteError('instance_busy', `Client "${this.options.name}" is already running in another process`);
149
+ }
150
+ try {
151
+ await this.prepare();
152
+ await this.launch();
153
+ await this.waitUntilStarted(timeout);
154
+ return this.status();
155
+ }
156
+ catch (err) {
157
+ this.lastError = err.message;
158
+ await this.shutdown('crashed');
159
+ throw err;
160
+ }
161
+ }
162
+ /** Downloads and verifies everything needed to launch (idempotent). */
163
+ async prepare() {
164
+ this.setPhase('preparing');
165
+ this.headlessValue = this.resolveHeadless();
166
+ const game = await prepareGame(this.paths, {
167
+ version: this.options.version,
168
+ loader: this.options.loader,
169
+ javaPath: this.options.javaPath,
170
+ allowJavaDownload: this.options.allowJavaDownload,
171
+ headless: this.headlessValue,
172
+ onLine: (line) => this.note(`installer: ${line}`),
173
+ });
174
+ this.game = game;
175
+ if (game.names.kind === 'unsupported')
176
+ this.note(`probe disabled: ${game.names.reason}`);
177
+ const loader = game.loader ? ` with ${game.loader.kind} ${game.loader.build}` : '';
178
+ this.note(`java ${game.java.version} (${game.java.path}) for Minecraft ${game.json.id}${loader}`);
179
+ this.mods = game.loader ? await resolveMods(this.paths, this.options.mods ?? [], game.json.id, game.loader.kind) : [];
180
+ await syncMods(this.gameDir, this.mods);
181
+ for (const m of this.mods)
182
+ this.note(`mod ${m.name} (${m.source})`);
183
+ }
184
+ resolveHeadless() {
185
+ if (this.render === 'off')
186
+ return true;
187
+ if (this.account.type === 'offline' && process.platform !== 'linux') {
188
+ this.note('offline accounts can only render on Linux with Xvfb (HeadlessMC policy); running headless — use a Microsoft account for screenshots');
189
+ return true;
190
+ }
191
+ return false;
192
+ }
193
+ async launch() {
194
+ const { json, java, loader, names, hmcJar } = this.game;
195
+ const probeJar = await installProbe(this.paths);
196
+ if (this.server) {
197
+ this.setPhase('waiting_for_server');
198
+ const deadline = Date.now() + (this.options.waitForServerMs ?? 120_000);
199
+ while (!(await tcpReachable(this.server.host, this.server.port))) {
200
+ if (this.stopping)
201
+ throw new CalciteError('stopped', 'Stopped while waiting for the server');
202
+ if (Date.now() > deadline)
203
+ throw new CalciteError('server_unreachable', `Server ${this.server.host}:${this.server.port} is not reachable`);
204
+ await sleep(2000);
205
+ }
206
+ }
207
+ // probe endpoint + config (paths inside may contain spaces; the config file itself lives in a safe dir)
208
+ this.probe = new ProbeServer();
209
+ await this.probe.listen();
210
+ this.probe.on('connected', () => this.onProbeConnected());
211
+ this.probe.on('disconnected', () => this.note('probe disconnected'));
212
+ this.probeConfig = join(this.paths.probe, `${this.options.name}-${randomBytes(6).toString('hex')}.properties`);
213
+ const cfg = [
214
+ `port=${this.probe.port}`,
215
+ `token=${this.probe.token}`,
216
+ // name tables the probe tries in order (a mapping file or "official")
217
+ ...(names.kind === 'probe' ? names.candidates.map((c, i) => `mappings.${i + 1}=${propValue(c)}`) : []),
218
+ `headless=${this.headlessValue}`,
219
+ `render=${this.render === 'always' ? 'on' : 'off'}`,
220
+ 'exitOnDisconnect=true',
221
+ '',
222
+ ].join('\n');
223
+ await mkdir(this.paths.probe, { recursive: true });
224
+ await writeFile(this.probeConfig, cfg, { mode: 0o600 });
225
+ await writeOptions(this.gameDir, defaultOptions({ renderDistance: this.options.renderDistance, maxFps: this.options.maxFps }));
226
+ let displayEnv = {};
227
+ let virtualDisplay = false;
228
+ if (!this.headlessValue) {
229
+ // offline accounts may only render on a virtual display (HeadlessMC); on-demand clients stay invisible when Xvfb exists
230
+ this.display = await acquireDisplay({ forceVirtual: this.account.type === 'offline' || (this.render === 'on-demand' && which('Xvfb') !== null) });
231
+ displayEnv = this.display.env;
232
+ virtualDisplay = this.display.virtual;
233
+ }
234
+ const proxyArgs = Object.entries(javaProxyProps()).map(([k, v]) => `-D${k}=${v}`);
235
+ const jvmArgs = [`-Xmx${this.options.memory ?? '2G'}`, ...proxyArgs, ...(this.options.jvmArgs ?? [])];
236
+ if (names.kind !== 'unsupported')
237
+ jvmArgs.unshift(`-javaagent:${probeJar}=${this.probeConfig}`);
238
+ // HeadlessMC's stubbed LWJGL buffers have no native address; JOML's Unsafe path writes to it and crashes the JVM
239
+ if (this.headlessValue)
240
+ jvmArgs.unshift('-Djoml.nounsafe=true');
241
+ const gameArgs = [...(this.options.gameArgs ?? [])];
242
+ if (this.server) {
243
+ if (supportsQuickPlay(json))
244
+ gameArgs.unshift('--quickPlayMultiplayer', `${this.server.host}:${this.server.port}`);
245
+ else
246
+ gameArgs.unshift('--server', this.server.host, '--port', String(this.server.port));
247
+ }
248
+ const offline = this.account.type === 'offline';
249
+ // a private HeadlessMC location per client: its own account selection, config and caches
250
+ const location = join(this.gameDir, '.headlessmc');
251
+ let accountName;
252
+ try {
253
+ accountName = await prepareAccount(this.paths, location, this.account);
254
+ }
255
+ catch (err) {
256
+ const code = err.code;
257
+ throw code ? new CalciteError(code, err.message) : err;
258
+ }
259
+ await writeHmcProfile(location, json.id, this.gameDir, java.major, loader);
260
+ const props = {
261
+ 'hmc.files.mc': this.paths.minecraft,
262
+ 'hmc.files.game': this.gameDir,
263
+ 'hmc.java.versions': hmcListEntry(java.path),
264
+ 'hmc.java.download': 'false',
265
+ // HeadlessMC only lets offline accounts render when it sees Xvfb running
266
+ 'hmc.xvfb.check': String(virtualDisplay),
267
+ };
268
+ const command = [
269
+ 'launch',
270
+ ...hmcVersionArgs(json.id, loader),
271
+ ...(offline ? ['--offline'] : []),
272
+ ...(this.headlessValue ? ['--headless'] : []),
273
+ `--jvm=${jvmArgs.map(hmcQuote).join(' ')}`,
274
+ ...(gameArgs.length ? [`--game=${gameArgs.map(hmcQuote).join(' ')}`] : []),
275
+ ];
276
+ const env = { ...process.env, ...displayEnv };
277
+ const sync = () => {
278
+ if (!offline)
279
+ void syncAccount(this.paths, location, accountName).catch((err) => this.note(`account sync failed: ${err.message}`));
280
+ };
281
+ this.setPhase('starting');
282
+ this.joinRequested = false;
283
+ this.startedAt = Date.now();
284
+ const spawnGame = async () => {
285
+ let launched;
286
+ const launchedPromise = new Promise((r) => (launched = r));
287
+ // 26.x+: when no graphics backend can be created the game opens a modal error box and blocks forever
288
+ const backendErrors = [];
289
+ let backendTimer;
290
+ const noBackend = () => {
291
+ if (run !== this.run || this.stopping)
292
+ return;
293
+ const hint = process.platform === 'linux'
294
+ ? ' On Linux without a GPU install Mesa EGL (apt install libegl1 libegl-mesa0) or Vulkan (apt install mesa-vulkan-drivers), or use render "off".'
295
+ : ' Update the graphics drivers, or use render "off".';
296
+ this.fatalCode = 'renderer_unavailable';
297
+ this.lastError = `No graphics backend could be created: ${backendErrors.join('; ')}.${hint}`;
298
+ this.note(this.lastError);
299
+ this.setPhase('crashed');
300
+ void killTree(run.child);
301
+ };
302
+ this.run = runHmc({
303
+ javaPath: this.game.launcherJava.path,
304
+ hmcJar,
305
+ location,
306
+ props,
307
+ command,
308
+ env,
309
+ onLine: (line) => {
310
+ this.pushLog('game', line);
311
+ if (/Setting user:|Minecraft exited|LWJGL Version|Backend library/i.test(line))
312
+ launched();
313
+ const failure = /BackendCreationException: (.*)/.exec(line);
314
+ if (failure) {
315
+ backendErrors.push(failure[1].trim());
316
+ clearTimeout(backendTimer);
317
+ backendTimer = setTimeout(noBackend, 20_000);
318
+ }
319
+ else if (/Using graphics backend/.test(line))
320
+ clearTimeout(backendTimer);
321
+ },
322
+ });
323
+ const run = this.run;
324
+ void run.exited.then(() => clearTimeout(backendTimer));
325
+ void run.exited.then((code) => {
326
+ sync();
327
+ this.onGameExit(run, code);
328
+ });
329
+ // the session HeadlessMC refreshed before launching goes back to the shared store
330
+ void launchedPromise.then(sync);
331
+ };
332
+ await spawnGame();
333
+ }
334
+ async onProbeConnected() {
335
+ this.note('probe connected');
336
+ if (this.phaseValue === 'starting' || this.phaseValue === 'reconnecting')
337
+ this.setPhase('connecting');
338
+ if (!this.poller) {
339
+ this.poller = setInterval(() => void this.poll(), 1000);
340
+ }
341
+ }
342
+ async poll() {
343
+ if (!this.probe?.connected)
344
+ return;
345
+ let state;
346
+ try {
347
+ state = await this.probe.request('state', {}, 10_000);
348
+ }
349
+ catch (err) {
350
+ if (err instanceof ProbeError && err.code === 'not_ready')
351
+ return;
352
+ return;
353
+ }
354
+ const prev = this.lastState;
355
+ this.lastState = state;
356
+ if (JSON.stringify(prev) !== JSON.stringify(state))
357
+ this.emit('state', state);
358
+ if (state.screen && /LoadingErrorScreen|ModLoadingError/.test(state.screen) && !this.fatalCode && this.run) {
359
+ // Forge/NeoForge stay on an error screen when mods fail to load; relaunching would not help
360
+ const errors = this.logs.filter((l) => l.source === 'game' && /\/(ERROR|FATAL)\]|Exception|[Mm]issing|requires/.test(l.line)).slice(-12);
361
+ this.fatalCode = 'mod_loading_failed';
362
+ this.lastError = `Mod loading failed (${state.screen}); check the mods and the loader version:\n${errors.map((l) => l.line).join('\n')}`;
363
+ this.note(this.lastError);
364
+ this.setPhase('crashed');
365
+ void killTree(this.run.child);
366
+ return;
367
+ }
368
+ if (state.inGame && !state.loading && !LOADING_SCREEN.test(state.screen ?? '')) {
369
+ if (this.phaseValue !== 'in_game') {
370
+ this.inGameSince = Date.now();
371
+ this.everInGame = true;
372
+ this.setPhase('in_game');
373
+ }
374
+ else if (this.reconnects > 0 && Date.now() - this.inGameSince > 60_000) {
375
+ this.reconnects = 0; // stable again
376
+ }
377
+ }
378
+ else if (this.server &&
379
+ !this.joinRequested &&
380
+ this.phaseValue === 'connecting' &&
381
+ state.screen === 'TitleScreen' &&
382
+ !state.loading) {
383
+ // Pre-1.20 versions may ignore --server (e.g. 1.16.4+ when multiplayer privileges cannot be checked)
384
+ this.joinRequested = true;
385
+ this.note(`joining ${this.server.host}:${this.server.port} from the title screen`);
386
+ this.probe.request('connect', { host: this.server.host, port: this.server.port }).catch((err) => this.note(`join failed: ${err.message}`));
387
+ }
388
+ else if (state.screen === 'DisconnectedScreen' && this.phaseValue !== 'disconnected' && this.phaseValue !== 'reconnecting') {
389
+ this.lastError = `Disconnected: ${state.disconnectReason ?? 'unknown reason'}`;
390
+ this.setPhase('disconnected');
391
+ void this.maybeReconnect();
392
+ }
393
+ }
394
+ reconnectLimit() {
395
+ const r = this.options.reconnect;
396
+ if (r === false)
397
+ return 0;
398
+ if (typeof r === 'object')
399
+ return r.maxAttempts ?? 10;
400
+ return 10;
401
+ }
402
+ async maybeReconnect() {
403
+ if (this.stopping || this.relaunching || !this.server)
404
+ return;
405
+ if (this.reconnects >= this.reconnectLimit()) {
406
+ this.note(`not reconnecting: ${this.reconnects} attempts used`);
407
+ return;
408
+ }
409
+ this.relaunching = true;
410
+ try {
411
+ this.reconnects++;
412
+ const delay = Math.min(5000 * 2 ** (this.reconnects - 1), 60_000);
413
+ this.setPhase('reconnecting');
414
+ this.note(`reconnecting in ${delay}ms (attempt ${this.reconnects})`);
415
+ if (this.run)
416
+ await killTree(this.run.child);
417
+ await sleep(delay);
418
+ if (this.stopping)
419
+ return;
420
+ await this.cleanupRun();
421
+ await this.launch();
422
+ }
423
+ catch (err) {
424
+ this.lastError = err.message;
425
+ this.setPhase('crashed');
426
+ }
427
+ finally {
428
+ this.relaunching = false;
429
+ }
430
+ }
431
+ onGameExit(run, code) {
432
+ if (run !== this.run)
433
+ return; // an older run
434
+ this.emit('exit', code);
435
+ this.note(`game process exited with code ${code}`);
436
+ if (this.stopping || this.relaunching || this.fatalCode)
437
+ return;
438
+ const tail = this.logs.filter((l) => l.source === 'game').slice(-15).map((l) => l.line).join('\n');
439
+ this.lastError = `Game exited with code ${code}${tail ? `:\n${tail}` : ''}`;
440
+ this.setPhase('crashed');
441
+ // a crash during the very first start is reported to start(); later crashes are retried
442
+ if (this.everInGame)
443
+ void this.maybeReconnect();
444
+ }
445
+ async waitUntilStarted(timeoutMs) {
446
+ const deadline = Date.now() + timeoutMs;
447
+ for (;;) {
448
+ const phase = this.phaseValue;
449
+ if (phase === 'in_game')
450
+ return;
451
+ if (!this.server && this.lastState?.ready && this.lastState.loading === false && phase === 'connecting')
452
+ return;
453
+ if (phase === 'crashed')
454
+ throw new CalciteError(this.fatalCode ?? 'crashed', this.lastError ?? 'The game crashed during startup');
455
+ if (phase === 'disconnected' && this.reconnectLimit() === 0)
456
+ throw new CalciteError('disconnected', this.lastError ?? 'Disconnected');
457
+ if (Date.now() > deadline)
458
+ throw new CalciteError('start_timeout', `Client did not start within ${timeoutMs}ms (phase ${phase})`);
459
+ await sleep(250);
460
+ }
461
+ }
462
+ async cleanupRun() {
463
+ if (this.poller) {
464
+ clearInterval(this.poller);
465
+ this.poller = null;
466
+ }
467
+ if (this.run) {
468
+ await killTree(this.run.child);
469
+ this.run = null;
470
+ }
471
+ if (this.probe) {
472
+ await this.probe.close();
473
+ this.probe = null;
474
+ }
475
+ if (this.probeConfig) {
476
+ await rm(this.probeConfig, { force: true });
477
+ this.probeConfig = null;
478
+ }
479
+ this.display?.release();
480
+ this.display = null;
481
+ this.lastState = undefined;
482
+ }
483
+ async shutdown(final) {
484
+ this.stopping = true;
485
+ await this.cleanupRun();
486
+ if (this.releaseInstance) {
487
+ await this.releaseInstance();
488
+ this.releaseInstance = null;
489
+ }
490
+ this.setPhase(final);
491
+ }
492
+ /** Stops the game and releases all resources. */
493
+ async stop() {
494
+ if (this.phaseValue === 'stopped' || this.phaseValue === 'idle')
495
+ return;
496
+ this.setPhase('stopping');
497
+ await this.shutdown('stopped');
498
+ }
499
+ status() {
500
+ return {
501
+ name: this.options.name,
502
+ version: this.game?.json.id ?? this.options.version,
503
+ loader: this.game?.loader ? `${this.game.loader.kind}@${this.game.loader.build}` : this.options.loader,
504
+ mods: this.mods.length ? this.mods.map((m) => m.name) : undefined,
505
+ phase: this.phaseValue,
506
+ render: this.render,
507
+ headless: this.headlessValue,
508
+ account: this.account,
509
+ server: this.server,
510
+ gameDir: this.gameDir,
511
+ pid: this.run?.child.pid,
512
+ java: this.game?.java.version,
513
+ startedAt: this.startedAt,
514
+ reconnects: this.reconnects,
515
+ lastError: this.lastError,
516
+ probeConnected: !!this.probe?.connected,
517
+ game: this.lastState,
518
+ };
519
+ }
520
+ // ------------------------------------------------------------------ operations
521
+ requireProbe() {
522
+ if (this.game?.names.kind === 'unsupported') {
523
+ throw new CalciteError('unsupported_version', this.game.names.reason);
524
+ }
525
+ if (!this.probe?.connected)
526
+ throw new CalciteError('not_connected', `Client "${this.options.name}" is not running (phase ${this.phaseValue})`);
527
+ return this.probe;
528
+ }
529
+ }
530
+ //# sourceMappingURL=client-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-core.js","sourceRoot":"","sources":["../src/client-core.ts"],"names":[],"mappings":"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"}