@origami-minecraft/devbuilds
Version:
Origami is a terminal-first Minecraft launcher that supports authentication, installation, and launching of Minecraft versions — with built-in support for Microsoft accounts, mod loaders, profile management, and more. Designed for power users, modders, an
80 lines (59 loc) • 2.71 kB
text/typescript
import axios from 'axios';
import ora from 'ora';
import path from 'path';
import fs from 'fs-extra';
import { GitHubRelease } from '../../types/github';
import { cleanDir, ensureDir, localpath } from '../utils/common';
import { downloader } from '../utils/download';
import { AUTHLIB_ARGS } from '../../config/defaults';
const RELEASE_INFO = 'release.json';
async function fetchAllReleases(): Promise<GitHubRelease[]> {
const url = 'https://api.github.com/repos/yushijinhun/authlib-injector/releases?per_page=100';
const response = await axios.get<GitHubRelease[]>(url, {
headers: {
'Accept': 'application/vnd.github+json',
'User-Agent': 'axios-client',
},
});
return response.data;
}
async function get_authlib(server: string): Promise<string> {
const spinner = ora('AuthLib: Fetching AuthLib').start();
const authlibDir = path.join(localpath(false), 'authlib');
const jarPath = path.join(authlibDir, 'authlib-injector.jar');
const releaseInfoPath = path.join(authlibDir, RELEASE_INFO);
try {
const releases = await fetchAllReleases();
for (const release of releases) {
const tag = release.tag_name;
const matchingAsset = release.assets.find(
asset =>
asset.name.endsWith('.jar') &&
asset.name.toLowerCase().includes('authlib')
);
if (!matchingAsset) continue;
const jarExists = fs.existsSync(jarPath);
const tagMatches =
fs.existsSync(releaseInfoPath) &&
(await fs.readJson(releaseInfoPath)).tag === tag;
if (jarExists && tagMatches) {
spinner.succeed(`AuthLib: Existing up-to-date injector found (${tag})`);
return AUTHLIB_ARGS.replaceAll('$AUTH', `${jarPath}`).replaceAll('$SERVER', server);
}
spinner.text = `AuthLib: Downloading latest injector from ${tag}...`;
cleanDir(authlibDir);
ensureDir(authlibDir);
spinner.stop();
await downloader(matchingAsset.browser_download_url, jarPath);
await fs.writeJson(releaseInfoPath, { tag }, { spaces: 2 });
spinner.succeed(`AuthLib: Downloaded and saved ${tag}`);
return AUTHLIB_ARGS.replaceAll('$AUTH', `${jarPath}`).replaceAll('$SERVER', server);
}
spinner.fail('AuthLib: No suitable authlib-injector jar found in any release.');
return '';
} catch (error) {
spinner.fail('AuthLib: Failed to fetch or download: ' + (error as Error).message);
return '';
}
}
export default get_authlib;