npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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.

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-node

Quick 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