java-launcher-node
v1.0.0
Published
Library for creating Minecraft Java launchers. Supports offline and Ely.by authentication, version management, Fabric loader, asset downloading, and launching.
Maintainers
Readme
java-launcher-node
Library Node.js untuk membuat Minecraft Java Launcher. Mendukung autentikasi offline & Ely.by, pengelolaan versi, Fabric Loader, download aset & Java runtime, serta launching Minecraft.
Fitur
- Autentikasi: Offline, Ely.by (password), Ely.by (OAuth Device Code)
- Versi: Ambil daftar versi, metadata, dan version.json dari Mojang
- Mod Loader: Vanilla dan Fabric
- Download: Client JAR, libraries + native extraction, assets, Java runtime
- Launch: Build arguments JVM + game, spawn process Minecraft
- Progress: Callback real-time untuk semua download
- Skip otomatis: File yang sudah ada dan valid SHA1-nya tidak di-download ulang
Instalasi
npm install java-launcher-nodeQuick Start
High-Level API (MinecraftLauncher)
const { MinecraftLauncher } = require('java-launcher-node');
const launcher = new MinecraftLauncher({
minecraftDir: './minecraft',
runtimeDir: './runtime',
minRam: '2G',
maxRam: '4G',
onProgress: (p) => console.log(p.status, p.task, p.label),
});
// Login offline
const auth = launcher.loginOffline('Player123');
// Atau login Ely.by
// const auth = await launcher.loginElyBy('[email protected]', 'password');
// Launch
const child = await launcher.launch({
username: auth.username,
uuid: auth.uuid,
accessToken: auth.accessToken,
version: '1.21',
loader: 'vanilla',
// loader: 'fabric',
// loaderVersion: '0.16.10',
});
console.log(`Minecraft running (PID: ${child.pid})`);Low-Level API
const { auth, manifest, download, launch } = require('java-launcher-node');
// 1. Login
const user = auth.loginOffline('Player123');
// 2. Ambil daftar versi
const versions = await manifest.getVersions('release');
const versionData = await manifest.getVersionData('1.21');
// 3. Download
await download.downloadClient(versionData, '1.21', './minecraft');
const classpath = await download.downloadLibraries(versionData, '1.21', './minecraft');
await download.downloadAssetIndex(versionData, './minecraft');
await download.downloadAssets(versionData, './minecraft');
const javaPath = await download.downloadJava(versionData, './runtime');
// 4. Build args & launch
const { args, gameDir } = launch.buildLaunchArgs(versionData, {
username: user.username,
uuid: user.uuid,
versionId: '1.21',
minecraftDir: './minecraft',
classpathLibs: classpath,
});
launch.launchMinecraft(javaPath, args, gameDir);API Reference
MinecraftLauncher
Kelas utama untuk high-level launcher.
Constructor
new MinecraftLauncher({ minecraftDir, runtimeDir, minRam, maxRam, resolution, launcherName, launcherVersion, onProgress })| Opsi | Default | Deskripsi |
|---|---|---|
| minecraftDir | ./minecraft | Folder utama (versions, libraries, assets, mods) |
| runtimeDir | ./runtime | Folder Java runtime |
| minRam | 2G | RAM awal (-Xms) |
| maxRam | 4G | RAM maksimal (-Xmx) |
| resolution | { width: 854, height: 480 } | Resolusi layar |
| launcherName | java-launcher-node | Nama launcher |
| launcherVersion | 1.0.0 | Versi launcher |
| onProgress | null | Callback progress (lihat bawah) |
Methods
loginOffline(username) → { uuid, username, accessToken, userType }
Login offline tanpa akun.
loginElyBy(email, password) → { uuid, username, accessToken, userType }
Login via Ely.by dengan email & password.
loginElyByDevice(onCode?) → { uuid, username, accessToken, userType }
Login via Ely.by OAuth Device Code. onCode dipanggil dengan { user_code, verification_uri, expires_in }.
launch(options) → ChildProcess
Melakukan download + launch Minecraft secara otomatis.
| Opsi | Wajib | Deskripsi |
|---|---|---|
| username | Ya | Nama pemain |
| uuid | Tidak | UUID (auto-generate jika kosong) |
| accessToken | Tidak | Token akses |
| userType | Tidak | mojang (default) |
| version | Ya | ID versi Minecraft (contoh: 1.21) |
| loader | Tidak | vanilla (default) atau fabric |
| loaderVersion | Jika fabric | Versi Fabric Loader |
| mods | Tidak | Array path .jar mod tambahan |
auth
const { auth } = require('java-launcher-node');| Fungsi | Return |
|---|---|
| loginOffline(username) | { uuid, username, accessToken, userType } |
| loginElyBy(email, password) | Promise<{ uuid, username, accessToken, userType }> |
| loginElyByDevice(onCode?) | Promise<{ uuid, username, accessToken, userType }> |
manifest
const { manifest } = require('java-launcher-node');| Fungsi | Return | Deskripsi |
|---|---|---|
| getVersionManifest() | Promise<object> | Manifest versi dari Mojang |
| getVersions(type?) | Promise<array> | Daftar versi, filter type (release, snapshot, dll) |
| getVersionData(versionId) | Promise<object> | Version.json untuk versi tertentu |
| getFabricGameVersions() | Promise<array> | Daftar versi Minecraft yang support Fabric |
| getFabricLoaders(mcVersion) | Promise<array> | Daftar loader Fabric untuk versi tertentu |
| getFabricProfile(mcVersion, loaderVersion) | Promise<object> | Profile Fabric (JSON) |
| getFabricInstallerVersions() | Promise<array> | Daftar versi installer Fabric |
download
const { download } = require('java-launcher-node');Semua fungsi menerima onProgress opsional.
| Fungsi | Deskripsi |
|---|---|
| downloadClient(versionData, versionId, minecraftDir, onProgress?) | Download client.jar |
| downloadLibraries(versionData, versionId, minecraftDir, onProgress?) | Download semua library + extract native. Return array path classpath |
| downloadAssetIndex(versionData, minecraftDir, onProgress?) | Download asset index JSON |
| downloadAssets(versionData, minecraftDir, onProgress?) | Download semua file aset |
| downloadJava(versionData, runtimeDir, onProgress?) | Download & extract Java runtime. Return path executable |
| downloadAuthlibInjector(minecraftDir, onProgress?) | Download authlib-injector.jar untuk skin Ely.by |
launch
const { launch } = require('java-launcher-node');| Fungsi | Deskripsi |
|---|---|
| buildLaunchArgs(versionData, { username, versionId, minecraftDir, classpathLibs, ... }) | Build array argumen JVM + game |
| launchMinecraft(javaPath, args, cwd, onClose?) | Spawn process Minecraft. Return ChildProcess |
util
const { util } = require('java-launcher-node');| Fungsi | Deskripsi |
|---|---|
| ensureDir(dir) | Buat folder rekursif |
| computeSha1(filePath) | Hitung SHA1 file |
| verifySha1(filePath, expected) | Verifikasi SHA1 |
| generateUUID() | Generate UUID v4 acak |
| normalizeUUID(uuid) | Format UUID dengan dash |
| downloadFile(url, dest, label, sha1?, size?, onProgress?, task?, current?, total?) | Download dengan progress & verifikasi |
| checkRules(rules) | Cek rules library/argumen untuk platform saat ini |
| extractNatives(jarPath, destDir) | Ekstrak .dll/.so/.dylib dari JAR |
| mergeVersionData(parent, child) | Gabung version data vanilla + loader |
| CURRENT_OS, CURRENT_ARCH, IS_WINDOWS | Deteksi platform |
| getJavaPlatformKey() | Key platform untuk manifest Java |
Progress Callback
Semua fungsi download menerima onProgress dengan format:
onProgress({
status, // 'downloading' | 'extracting' | 'done' | 'skipped' | 'checking'
task, // 'client' | 'libraries' | 'assets' | 'asset-index' | 'java' | 'authlib'
label, // Label human-readable, contoh: "[3/50] net.minecraft:client"
current, // Item ke-n (untuk total > 1)
total, // Total item
bytes, // Bytes terdownload (per-file)
bytesTotal, // Total bytes file saat ini
})Contoh implementasi di CLI
const { MinecraftLauncher } = require('java-launcher-node');
new MinecraftLauncher({
onProgress: (p) => {
if (p.bytesTotal > 0) {
const pct = (p.bytes / p.bytesTotal * 100).toFixed(1);
process.stdout.write(`\r${p.label} [${pct}%]`);
}
if (p.status === 'done') process.stdout.write('\n');
},
});Directory Structure
Setelah download, struktur foldernya:
minecraft/
├── versions/<id>/
│ ├── <id>.json # version.json
│ └── client.jar
├── libraries/... # Library JARs (struktur Maven)
├── assets/
│ ├── indexes/<id>.json
│ └── objects/<xx>/<hash>
├── natives/<id>/ # Native .dll / .so
├── mods/ # Mods (.jar)
└── authlib-injector.jar
runtime/
└── java/<component>-<ver>-<platform>/
└── bin/
├── java.exe
└── ...Dependencies
License
MIT
