Skip to content

Errors

Every error thrown by a public API is an MinecraftKitError:

ts
import { isMinecraftKitError, isErrorCode } from "@loontail/minecraft-kit";

try {
  await kit.install.run(plan);
} catch (error) {
  if (isErrorCode(error, "INTEGRITY_HASH_MISMATCH")) {
    console.warn("file corrupted:", error.context.url);
  } else if (isMinecraftKitError(error)) {
    console.error(error.code, error.message);
    throw error;
  } else {
    throw error;
  }
}

Codes

The full list of stable codes (src/types/errors.ts):

NETWORK_TIMEOUT, NETWORK_HTTP_ERROR, NETWORK_ABORTED, INTEGRITY_HASH_MISMATCH, INTEGRITY_SIZE_MISMATCH, MANIFEST_INVALID, MANIFEST_NOT_FOUND, METADATA_PARSE_ERROR, FILESYSTEM_PATH_TRAVERSAL, FILESYSTEM_WRITE_ERROR, FILESYSTEM_READ_ERROR, ARCHIVE_INVALID, ARCHIVE_TOO_LARGE, ARCHIVE_ENTRY_REJECTED, RUNTIME_NOT_FOUND, RUNTIME_UNSUPPORTED_PLATFORM, FORGE_PROCESSOR_FAILED, FORGE_INSTALLER_INVALID, LAUNCH_JAVA_NOT_FOUND, LAUNCH_PROCESS_FAILED, LAUNCH_ABORTED, VERIFICATION_FAILED, INVALID_INPUT, NOT_IMPLEMENTED, UNSUPPORTED_VERSION, LZMA_DECODE_ERROR.

Adding new codes is non-breaking. Renaming or removing a code is a breaking change.

Context

Every error carries a frozen context object — typically { url, filePath, expectedHash, actualHash, httpStatus, exitCode, ... }. Treat this as JSON-safe; error.toJSON() returns a serialisable representation without the prototype chain.

MIT License