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