@bkm016/calcite 0.0.0-stage → 0.1.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/LICENSE +21 -0
  2. package/README.md +314 -2
  3. package/THIRD_PARTY_NOTICES.md +44 -0
  4. package/dist/accounts.d.ts +27 -0
  5. package/dist/accounts.js +114 -0
  6. package/dist/accounts.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +242 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/client.d.ts +251 -0
  11. package/dist/client.js +671 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/display.d.ts +23 -0
  14. package/dist/display.js +135 -0
  15. package/dist/display.js.map +1 -0
  16. package/dist/hmc.d.ts +33 -0
  17. package/dist/hmc.js +130 -0
  18. package/dist/hmc.js.map +1 -0
  19. package/dist/index.d.ts +11 -0
  20. package/dist/index.js +8 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/java.d.ts +31 -0
  23. package/dist/java.js +218 -0
  24. package/dist/java.js.map +1 -0
  25. package/dist/lock.d.ts +13 -0
  26. package/dist/lock.js +79 -0
  27. package/dist/lock.js.map +1 -0
  28. package/dist/log.d.ts +13 -0
  29. package/dist/log.js +20 -0
  30. package/dist/log.js.map +1 -0
  31. package/dist/manager.d.ts +15 -0
  32. package/dist/manager.js +65 -0
  33. package/dist/manager.js.map +1 -0
  34. package/dist/mcp.d.ts +13 -0
  35. package/dist/mcp.js +252 -0
  36. package/dist/mcp.js.map +1 -0
  37. package/dist/mojang.d.ts +70 -0
  38. package/dist/mojang.js +109 -0
  39. package/dist/mojang.js.map +1 -0
  40. package/dist/net.d.ts +21 -0
  41. package/dist/net.js +246 -0
  42. package/dist/net.js.map +1 -0
  43. package/dist/options.d.ts +14 -0
  44. package/dist/options.js +50 -0
  45. package/dist/options.js.map +1 -0
  46. package/dist/paths.d.ts +27 -0
  47. package/dist/paths.js +48 -0
  48. package/dist/paths.js.map +1 -0
  49. package/dist/probe-server.d.ts +28 -0
  50. package/dist/probe-server.js +132 -0
  51. package/dist/probe-server.js.map +1 -0
  52. package/dist/version.d.ts +2 -0
  53. package/dist/version.js +11 -0
  54. package/dist/version.js.map +1 -0
  55. package/package.json +57 -4
  56. package/vendor/calcite-probe.jar +0 -0
package/dist/net.js ADDED
@@ -0,0 +1,246 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createWriteStream } from 'node:fs';
3
+ import { mkdir, readFile, rename, rm, stat } from 'node:fs/promises';
4
+ import http from 'node:http';
5
+ import https from 'node:https';
6
+ import { isIP } from 'node:net';
7
+ import { dirname } from 'node:path';
8
+ import { pipeline } from 'node:stream/promises';
9
+ import tls from 'node:tls';
10
+ import { logger } from './log.js';
11
+ const log = logger('net');
12
+ export const USER_AGENT = 'calcite (+https://github.com/bkm016/Calcite)';
13
+ export class HttpError extends Error {
14
+ url;
15
+ status;
16
+ constructor(url, status) {
17
+ super(`HTTP ${status} for ${url}`);
18
+ this.url = url;
19
+ this.status = status;
20
+ }
21
+ }
22
+ function env(name) {
23
+ return process.env[name] || process.env[name.toLowerCase()] || undefined;
24
+ }
25
+ function ipv4ToInt(ip) {
26
+ return ip.split('.').reduce((acc, part) => (acc << 8) + Number(part), 0) >>> 0;
27
+ }
28
+ /** NO_PROXY matching: "*", exact hosts, ".suffix"/"suffix" domains, host:port and IPv4 CIDR. */
29
+ export function bypassProxy(target, noProxy = env('NO_PROXY') ?? '') {
30
+ const host = target.hostname.replace(/^\[|\]$/g, '').toLowerCase();
31
+ const port = target.port || (target.protocol === 'https:' ? '443' : '80');
32
+ for (let rule of noProxy.split(/[\s,]+/)) {
33
+ rule = rule.trim().toLowerCase();
34
+ if (!rule)
35
+ continue;
36
+ if (rule === '*')
37
+ return true;
38
+ let rulePort;
39
+ const m = /^([^:]+):(\d+)$/.exec(rule);
40
+ if (m)
41
+ [, rule, rulePort] = m;
42
+ if (rulePort && rulePort !== port)
43
+ continue;
44
+ if (rule.includes('/')) {
45
+ const [net, bits] = rule.split('/');
46
+ if (isIP(net) !== 4 || isIP(host) !== 4)
47
+ continue;
48
+ const mask = Number(bits) === 0 ? 0 : (~0 << (32 - Number(bits))) >>> 0;
49
+ if ((ipv4ToInt(host) & mask) === (ipv4ToInt(net) & mask))
50
+ return true;
51
+ continue;
52
+ }
53
+ const domain = rule.replace(/^\*?\./, '');
54
+ if (host === domain || host.endsWith(`.${domain}`))
55
+ return true;
56
+ }
57
+ return false;
58
+ }
59
+ /** The proxy to use for {@code target}, honouring HTTPS_PROXY / HTTP_PROXY / NO_PROXY (any case). */
60
+ export function proxyFor(target) {
61
+ const raw = target.protocol === 'https:' ? (env('HTTPS_PROXY') ?? env('HTTP_PROXY')) : env('HTTP_PROXY');
62
+ if (!raw || bypassProxy(target))
63
+ return undefined;
64
+ return new URL(raw.includes('://') ? raw : `http://${raw}`);
65
+ }
66
+ function proxyAuth(proxy) {
67
+ if (!proxy.username)
68
+ return {};
69
+ const cred = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`;
70
+ return { 'proxy-authorization': `Basic ${Buffer.from(cred).toString('base64')}` };
71
+ }
72
+ /** Opens a TLS connection to {@code target} through an HTTP(S) proxy using CONNECT. */
73
+ function tunnel(proxy, target, timeoutMs) {
74
+ return new Promise((resolve, reject) => {
75
+ const authority = `${target.hostname}:${target.port || 443}`;
76
+ const req = (proxy.protocol === 'https:' ? https : http).request({
77
+ host: proxy.hostname,
78
+ port: proxy.port || (proxy.protocol === 'https:' ? 443 : 80),
79
+ method: 'CONNECT',
80
+ path: authority,
81
+ headers: { host: authority, ...proxyAuth(proxy) },
82
+ agent: false,
83
+ });
84
+ const timer = setTimeout(() => req.destroy(new Error(`Proxy CONNECT to ${authority} timed out`)), timeoutMs);
85
+ req.once('connect', (res, socket) => {
86
+ clearTimeout(timer);
87
+ if (res.statusCode !== 200) {
88
+ socket.destroy();
89
+ reject(new Error(`Proxy CONNECT to ${authority} failed: HTTP ${res.statusCode}`));
90
+ return;
91
+ }
92
+ const secure = tls.connect({ socket, servername: isIP(target.hostname) ? undefined : target.hostname });
93
+ secure.once('secureConnect', () => resolve(secure));
94
+ secure.once('error', reject);
95
+ });
96
+ req.once('error', (err) => {
97
+ clearTimeout(timer);
98
+ reject(err);
99
+ });
100
+ req.end();
101
+ });
102
+ }
103
+ /** One GET without redirects. Resolves with the response (body not yet consumed). */
104
+ async function getOnce(url, { timeoutMs = 60_000, idleMs = 120_000 }) {
105
+ const proxy = proxyFor(url);
106
+ const headers = { 'user-agent': USER_AGENT, accept: '*/*', 'accept-encoding': 'identity' };
107
+ let mod = url.protocol === 'https:' ? https : http;
108
+ let options = {
109
+ protocol: url.protocol,
110
+ host: url.hostname,
111
+ port: url.port || undefined,
112
+ path: `${url.pathname}${url.search}`,
113
+ };
114
+ if (proxy && url.protocol === 'https:') {
115
+ const socket = await tunnel(proxy, url, timeoutMs);
116
+ options = { ...options, agent: false, createConnection: () => socket };
117
+ }
118
+ else if (proxy) {
119
+ // Plain HTTP through a proxy: absolute-form request target.
120
+ mod = proxy.protocol === 'https:' ? https : http;
121
+ options = { protocol: proxy.protocol, host: proxy.hostname, port: proxy.port || undefined, path: url.toString(), agent: false };
122
+ Object.assign(headers, proxyAuth(proxy), { host: url.host });
123
+ }
124
+ return new Promise((resolve, reject) => {
125
+ const req = mod.request({ ...options, method: 'GET', headers });
126
+ const timer = setTimeout(() => req.destroy(new Error(`Timed out waiting for ${url}`)), timeoutMs);
127
+ req.once('response', (res) => {
128
+ clearTimeout(timer);
129
+ req.setTimeout(idleMs, () => req.destroy(new Error(`Download of ${url} stalled`)));
130
+ resolve(res);
131
+ });
132
+ req.once('error', (err) => {
133
+ clearTimeout(timer);
134
+ reject(err);
135
+ });
136
+ req.end();
137
+ });
138
+ }
139
+ /** GET following redirects. Throws {@link HttpError} for non-2xx responses. */
140
+ async function get(url, opts = {}) {
141
+ let current = new URL(url);
142
+ for (let hop = 0;; hop++) {
143
+ const res = await getOnce(current, opts);
144
+ const status = res.statusCode ?? 0;
145
+ if (status >= 300 && status < 400 && res.headers.location) {
146
+ res.resume();
147
+ if (hop >= 10)
148
+ throw new Error(`Too many redirects for ${url}`);
149
+ current = new URL(res.headers.location, current);
150
+ continue;
151
+ }
152
+ if (status >= 200 && status < 300)
153
+ return res;
154
+ res.resume();
155
+ throw new HttpError(url, status);
156
+ }
157
+ }
158
+ function retryable(err) {
159
+ return !(err instanceof HttpError) || err.status === 429 || err.status >= 500;
160
+ }
161
+ /** Runs a whole transfer with retries and exponential backoff on network errors, 429 and 5xx. */
162
+ async function withRetries(url, fn, retries = 4) {
163
+ for (let attempt = 0;; attempt++) {
164
+ try {
165
+ return await fn();
166
+ }
167
+ catch (err) {
168
+ if (!retryable(err) || attempt >= retries)
169
+ throw err;
170
+ const delay = 1000 * 2 ** attempt;
171
+ log.debug(`retry ${attempt + 1}/${retries} for ${url} in ${delay}ms: ${err.message}`);
172
+ await new Promise((r) => setTimeout(r, delay));
173
+ }
174
+ }
175
+ }
176
+ async function readAll(res) {
177
+ const chunks = [];
178
+ for await (const chunk of res)
179
+ chunks.push(chunk);
180
+ const expected = Number(res.headers['content-length'] ?? -1);
181
+ const body = Buffer.concat(chunks);
182
+ if (expected >= 0 && body.length !== expected)
183
+ throw new Error(`Truncated response: ${body.length}/${expected} bytes`);
184
+ return body;
185
+ }
186
+ export async function httpText(url) {
187
+ return withRetries(url, async () => (await readAll(await get(url))).toString('utf8'));
188
+ }
189
+ export async function httpJson(url) {
190
+ return JSON.parse(await httpText(url));
191
+ }
192
+ export async function hashFile(file, algorithm) {
193
+ return createHash(algorithm).update(await readFile(file)).digest('hex');
194
+ }
195
+ async function exists(file) {
196
+ try {
197
+ await stat(file);
198
+ return true;
199
+ }
200
+ catch {
201
+ return false;
202
+ }
203
+ }
204
+ /** Downloads to {@code dest} atomically (temp file + rename) and verifies the hash when given. */
205
+ export async function download(url, dest, opts = {}) {
206
+ const { sha1, sha256, reuse = true } = opts;
207
+ if (reuse && (await exists(dest))) {
208
+ if (sha1 && (await hashFile(dest, 'sha1')) === sha1.toLowerCase())
209
+ return dest;
210
+ if (sha256 && (await hashFile(dest, 'sha256')) === sha256.toLowerCase())
211
+ return dest;
212
+ if (!sha1 && !sha256)
213
+ return dest;
214
+ log.warn(`hash mismatch for existing ${dest}, downloading again`);
215
+ }
216
+ await mkdir(dirname(dest), { recursive: true });
217
+ const tmp = `${dest}.${process.pid}.${Date.now()}.part`;
218
+ try {
219
+ await withRetries(url, async () => {
220
+ const res = await get(url);
221
+ const expected = Number(res.headers['content-length'] ?? -1);
222
+ await pipeline(res, createWriteStream(tmp));
223
+ if (expected >= 0) {
224
+ const { size } = await stat(tmp);
225
+ if (size !== expected)
226
+ throw new Error(`Truncated download of ${url}: ${size}/${expected} bytes`);
227
+ }
228
+ });
229
+ if (sha1) {
230
+ const actual = await hashFile(tmp, 'sha1');
231
+ if (actual !== sha1.toLowerCase())
232
+ throw new Error(`SHA-1 mismatch for ${url}: expected ${sha1}, got ${actual}`);
233
+ }
234
+ if (sha256) {
235
+ const actual = await hashFile(tmp, 'sha256');
236
+ if (actual !== sha256.toLowerCase())
237
+ throw new Error(`SHA-256 mismatch for ${url}: expected ${sha256}, got ${actual}`);
238
+ }
239
+ await rename(tmp, dest);
240
+ return dest;
241
+ }
242
+ finally {
243
+ await rm(tmp, { force: true });
244
+ }
245
+ }
246
+ //# sourceMappingURL=net.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net.js","sourceRoot":"","sources":["../src/net.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Game options Calcite enforces so an unattended client never blocks on first-run screens and stays cheap.
3
+ * Unknown keys are ignored by versions that do not have them.
4
+ */
5
+ export declare function defaultOptions(opts?: {
6
+ renderDistance?: number;
7
+ maxFps?: number;
8
+ muted?: boolean;
9
+ }): Record<string, string>;
10
+ /** Parses options.txt ("key:value" lines). */
11
+ export declare function parseOptions(text: string): Map<string, string>;
12
+ export declare function serializeOptions(map: Map<string, string>): string;
13
+ /** Merges {@code overrides} into gameDir/options.txt, keeping every other existing option. */
14
+ export declare function writeOptions(gameDir: string, overrides: Record<string, string>): Promise<void>;
@@ -0,0 +1,50 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * Game options Calcite enforces so an unattended client never blocks on first-run screens and stays cheap.
5
+ * Unknown keys are ignored by versions that do not have them.
6
+ */
7
+ export function defaultOptions(opts = {}) {
8
+ return {
9
+ onboardAccessibility: 'false',
10
+ skipMultiplayerWarning: 'true',
11
+ joinedFirstServer: 'true',
12
+ tutorialStep: 'none',
13
+ pauseOnLostFocus: 'false',
14
+ narrator: '0',
15
+ fullscreen: 'false',
16
+ renderDistance: String(opts.renderDistance ?? 8),
17
+ simulationDistance: String(Math.min(opts.renderDistance ?? 8, 8)),
18
+ maxFps: String(opts.maxFps ?? 30),
19
+ ...(opts.muted === false ? {} : { soundCategory_master: '0.0' }),
20
+ };
21
+ }
22
+ /** Parses options.txt ("key:value" lines). */
23
+ export function parseOptions(text) {
24
+ const map = new Map();
25
+ for (const line of text.split(/\r?\n/)) {
26
+ const idx = line.indexOf(':');
27
+ if (idx > 0)
28
+ map.set(line.slice(0, idx), line.slice(idx + 1));
29
+ }
30
+ return map;
31
+ }
32
+ export function serializeOptions(map) {
33
+ return [...map].map(([k, v]) => `${k}:${v}`).join('\n') + '\n';
34
+ }
35
+ /** Merges {@code overrides} into gameDir/options.txt, keeping every other existing option. */
36
+ export async function writeOptions(gameDir, overrides) {
37
+ await mkdir(gameDir, { recursive: true });
38
+ const file = join(gameDir, 'options.txt');
39
+ let current = new Map();
40
+ try {
41
+ current = parseOptions(await readFile(file, 'utf8'));
42
+ }
43
+ catch {
44
+ // first launch
45
+ }
46
+ for (const [k, v] of Object.entries(overrides))
47
+ current.set(k, v);
48
+ await writeFile(file, serializeOptions(current));
49
+ }
50
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAsE,EAAE;IACrG,OAAO;QACL,oBAAoB,EAAE,OAAO;QAC7B,sBAAsB,EAAE,MAAM;QAC9B,iBAAiB,EAAE,MAAM;QACzB,YAAY,EAAE,MAAM;QACpB,gBAAgB,EAAE,OAAO;QACzB,QAAQ,EAAE,GAAG;QACb,UAAU,EAAE,OAAO;QACnB,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;QAChD,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAwB;IACvD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjE,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,SAAiC;IACnF,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,27 @@
1
+ /** Directory layout under CALCITE_HOME (default ~/.calcite). */
2
+ export interface CalcitePaths {
3
+ /** Root of all Calcite data. */
4
+ home: string;
5
+ /** Working directory of HeadlessMC: shared config and stored accounts (HeadlessMC/auth/.accounts.json). */
6
+ hmcHome: string;
7
+ /** HeadlessMC launcher jars. */
8
+ hmcJars: string;
9
+ /** Shared Minecraft directory: versions, libraries, assets. */
10
+ minecraft: string;
11
+ /** Java runtimes downloaded by Calcite. */
12
+ java: string;
13
+ /** Mojang client mappings. */
14
+ mappings: string;
15
+ /** Cached Mojang metadata. */
16
+ meta: string;
17
+ /** Per-client game directories. */
18
+ instances: string;
19
+ /** Directory for the probe jar and its config files; guaranteed free of spaces and commas. */
20
+ probe: string;
21
+ }
22
+ /**
23
+ * Picks a directory whose path can be passed through HeadlessMC's space-separated hmc.jvmargs and the
24
+ * -javaagent option (no spaces, commas, equals signs or quotes).
25
+ */
26
+ export declare function safeProbeDir(home: string): string;
27
+ export declare function resolvePaths(home?: string): CalcitePaths;
package/dist/paths.js ADDED
@@ -0,0 +1,48 @@
1
+ import { homedir, tmpdir, userInfo } from 'node:os';
2
+ import { join } from 'node:path';
3
+ const UNSAFE_FOR_JVM_ARGS = /[\s,=;"']/;
4
+ /**
5
+ * Picks a directory whose path can be passed through HeadlessMC's space-separated hmc.jvmargs and the
6
+ * -javaagent option (no spaces, commas, equals signs or quotes).
7
+ */
8
+ export function safeProbeDir(home) {
9
+ const candidates = [join(home, 'probe')];
10
+ if (process.platform === 'win32') {
11
+ candidates.push(join(process.env.PUBLIC || 'C:\\Users\\Public', 'calcite', 'probe'));
12
+ candidates.push(join(process.env.SystemDrive || 'C:', 'calcite-probe'));
13
+ }
14
+ else {
15
+ let user = 'user';
16
+ try {
17
+ user = String(userInfo().uid);
18
+ }
19
+ catch {
20
+ // keep default
21
+ }
22
+ candidates.push(join(tmpdir(), `calcite-${user}`, 'probe'));
23
+ candidates.push(join('/tmp', `calcite-${user}`, 'probe'));
24
+ }
25
+ const found = candidates.find((dir) => !UNSAFE_FOR_JVM_ARGS.test(dir));
26
+ if (!found) {
27
+ throw new Error(`Cannot find a directory without spaces for the probe; set CALCITE_PROBE_DIR. Tried: ${candidates.join(', ')}`);
28
+ }
29
+ return found;
30
+ }
31
+ export function resolvePaths(home = process.env.CALCITE_HOME || join(homedir(), '.calcite')) {
32
+ const probe = process.env.CALCITE_PROBE_DIR || safeProbeDir(home);
33
+ if (UNSAFE_FOR_JVM_ARGS.test(probe)) {
34
+ throw new Error(`CALCITE_PROBE_DIR must not contain spaces, commas, '=' or quotes: ${probe}`);
35
+ }
36
+ return {
37
+ home,
38
+ hmcHome: join(home, 'hmc-home'),
39
+ hmcJars: join(home, 'hmc'),
40
+ minecraft: join(home, 'minecraft'),
41
+ java: join(home, 'java'),
42
+ mappings: join(home, 'mappings'),
43
+ meta: join(home, 'meta'),
44
+ instances: join(home, 'instances'),
45
+ probe,
46
+ };
47
+ }
48
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAwBjC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAExC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,UAAU,GAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,mBAAmB,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACrF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,GAAG,MAAM,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,uFAAuF,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClI,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC;IACzF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,qEAAqE,KAAK,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAC/B,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { EventEmitter } from 'node:events';
2
+ export declare const PROBE_PROTOCOL = 1;
3
+ export declare class ProbeError extends Error {
4
+ readonly code: string;
5
+ constructor(code: string, message: string);
6
+ }
7
+ /**
8
+ * TCP endpoint (127.0.0.1, random port) the in-game probe connects to. Authenticated with a random token;
9
+ * JSON objects separated by newlines.
10
+ *
11
+ * Events: 'connected', 'disconnected'.
12
+ */
13
+ export declare class ProbeServer extends EventEmitter {
14
+ readonly token: string;
15
+ private server;
16
+ private socket;
17
+ private nextId;
18
+ private pending;
19
+ port: number;
20
+ listen(): Promise<number>;
21
+ get connected(): boolean;
22
+ private accept;
23
+ private onResponse;
24
+ private failAll;
25
+ /** Sends one request to the probe. */
26
+ request<T = unknown>(op: string, args?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
27
+ close(): Promise<void>;
28
+ }
@@ -0,0 +1,132 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { EventEmitter } from 'node:events';
3
+ import { createServer } from 'node:net';
4
+ import { createInterface } from 'node:readline';
5
+ import { logger } from './log.js';
6
+ const log = logger('probe');
7
+ export const PROBE_PROTOCOL = 1;
8
+ export class ProbeError extends Error {
9
+ code;
10
+ constructor(code, message) {
11
+ super(message);
12
+ this.code = code;
13
+ this.name = 'ProbeError';
14
+ }
15
+ }
16
+ /**
17
+ * TCP endpoint (127.0.0.1, random port) the in-game probe connects to. Authenticated with a random token;
18
+ * JSON objects separated by newlines.
19
+ *
20
+ * Events: 'connected', 'disconnected'.
21
+ */
22
+ export class ProbeServer extends EventEmitter {
23
+ token = randomBytes(24).toString('hex');
24
+ server = null;
25
+ socket = null;
26
+ nextId = 1;
27
+ pending = new Map();
28
+ port = 0;
29
+ async listen() {
30
+ this.server = createServer((socket) => this.accept(socket));
31
+ await new Promise((resolve, reject) => {
32
+ this.server.once('error', reject);
33
+ this.server.listen(0, '127.0.0.1', () => resolve());
34
+ });
35
+ const address = this.server.address();
36
+ if (!address || typeof address === 'string')
37
+ throw new Error('Probe server has no TCP address');
38
+ this.port = address.port;
39
+ return this.port;
40
+ }
41
+ get connected() {
42
+ return this.socket !== null;
43
+ }
44
+ accept(socket) {
45
+ socket.setNoDelay(true);
46
+ let authed = false;
47
+ const helloTimer = setTimeout(() => {
48
+ if (!authed)
49
+ socket.destroy();
50
+ }, 10_000);
51
+ const rl = createInterface({ input: socket });
52
+ rl.on('line', (line) => {
53
+ let msg;
54
+ try {
55
+ msg = JSON.parse(line);
56
+ }
57
+ catch {
58
+ socket.destroy();
59
+ return;
60
+ }
61
+ if (!authed) {
62
+ if (msg.type !== 'hello' || msg.token !== this.token) {
63
+ log.warn('rejected a probe connection with a wrong token');
64
+ socket.destroy();
65
+ return;
66
+ }
67
+ if (msg.protocol !== PROBE_PROTOCOL) {
68
+ log.warn(`probe protocol ${String(msg.protocol)} differs from ${PROBE_PROTOCOL}`);
69
+ }
70
+ authed = true;
71
+ clearTimeout(helloTimer);
72
+ this.socket?.destroy();
73
+ this.socket = socket;
74
+ log.debug(`probe connected (java ${String(msg.java)})`);
75
+ this.emit('connected', msg);
76
+ return;
77
+ }
78
+ this.onResponse(msg);
79
+ });
80
+ socket.on('error', () => undefined);
81
+ socket.on('close', () => {
82
+ clearTimeout(helloTimer);
83
+ if (this.socket === socket) {
84
+ this.socket = null;
85
+ this.failAll(new ProbeError('disconnected', 'The game closed the probe connection'));
86
+ this.emit('disconnected');
87
+ }
88
+ });
89
+ }
90
+ onResponse(msg) {
91
+ const id = Number(msg.id);
92
+ const pending = this.pending.get(id);
93
+ if (!pending)
94
+ return;
95
+ this.pending.delete(id);
96
+ clearTimeout(pending.timer);
97
+ if (msg.ok)
98
+ pending.resolve(msg.result);
99
+ else
100
+ pending.reject(new ProbeError(String(msg.code ?? 'error'), String(msg.error ?? 'probe error')));
101
+ }
102
+ failAll(err) {
103
+ for (const [id, p] of this.pending) {
104
+ clearTimeout(p.timer);
105
+ p.reject(err);
106
+ this.pending.delete(id);
107
+ }
108
+ }
109
+ /** Sends one request to the probe. */
110
+ request(op, args = {}, timeoutMs = 15_000) {
111
+ const socket = this.socket;
112
+ if (!socket)
113
+ return Promise.reject(new ProbeError('not_connected', 'The game probe is not connected'));
114
+ const id = this.nextId++;
115
+ return new Promise((resolve, reject) => {
116
+ const timer = setTimeout(() => {
117
+ this.pending.delete(id);
118
+ reject(new ProbeError('timeout', `Probe request "${op}" timed out after ${timeoutMs}ms`));
119
+ }, timeoutMs);
120
+ this.pending.set(id, { resolve: resolve, reject, timer });
121
+ socket.write(JSON.stringify({ id, op, args }) + '\n');
122
+ });
123
+ }
124
+ async close() {
125
+ this.failAll(new ProbeError('closed', 'Probe server closed'));
126
+ this.socket?.destroy();
127
+ this.socket = null;
128
+ await new Promise((resolve) => (this.server ? this.server.close(() => resolve()) : resolve()));
129
+ this.server = null;
130
+ }
131
+ }
132
+ //# sourceMappingURL=probe-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probe-server.js","sourceRoot":"","sources":["../src/probe-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Package version, read from package.json next to dist/. */
2
+ export declare const VERSION: string;
@@ -0,0 +1,11 @@
1
+ import { readFileSync } from 'node:fs';
2
+ /** Package version, read from package.json next to dist/. */
3
+ export const VERSION = (() => {
4
+ try {
5
+ return JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
6
+ }
7
+ catch {
8
+ return '0.0.0';
9
+ }
10
+ })();
11
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,OAAO,GAAW,CAAC,GAAG,EAAE;IACnC,IAAI,CAAC;QACH,OAAQ,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC,OAAO,CAAC;IACxH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,EAAE,CAAC"}