@minecraft/creator-tools
Version:
Minecraft Creator Tools command line and libraries.
102 lines (101 loc) • 3.9 kB
TypeScript
import IFile from "../storage/IFile";
import ILevelDbFileInfo from "./ILevelDbFileInfo";
/**
* Represents metadata about a single LDB file's index without loading full data.
* Used for lazy-loading to determine which files might contain a requested key.
*/
export interface ILevelDbFileIndex {
/** The file info including level and index */
fileInfo: ILevelDbFileInfo;
/** Smallest key in this file (from manifest) */
smallestKey?: string;
/** Largest key in this file (from manifest) */
largestKey?: string;
/** Whether this file has been fully loaded */
isLoaded: boolean;
/** Priority for loading (higher level files have lower priority) */
priority: number;
}
/**
* Represents metadata about a LOG file for lazy loading.
* LOG files contain the most recent writes and take priority.
*/
export interface ILevelDbLogIndex {
/** The log file */
file: IFile;
/** File name/index for sorting */
name: string;
/** Whether this file has been loaded */
isLoaded: boolean;
}
/**
* Represents a key location for on-demand loading.
* Tracks where a key can be found without loading its data.
*/
export interface IKeyLocation {
/** The file containing this key (LDB or LOG) */
file: IFile;
/** Whether this is from a LOG file (higher priority) */
isLogFile: boolean;
/** The file level (for LDB files, lower = newer) */
fileLevel: number;
/** The file index */
fileIndex: number;
}
/**
* LevelDbIndex manages metadata about LevelDB files to enable lazy loading.
*
* Instead of loading all files upfront, this class:
* 1. Parses the MANIFEST to understand file metadata
* 2. Tracks key ranges per file for efficient lookup
* 3. Enables on-demand loading of specific files when keys are requested
*
* This dramatically reduces initial memory usage for large worlds.
*/
export default class LevelDbIndex {
/** Indexed LDB files with metadata */
ldbFileIndexes: ILevelDbFileIndex[];
/** Indexed LOG files with metadata */
logFileIndexes: ILevelDbLogIndex[];
/** Map of file index to file info for quick lookup */
filesByIndex: Map<number, ILevelDbFileIndex>;
/** Deleted file numbers from manifest */
deletedFileNumbers: Set<number>;
/** Total number of files in the index */
get totalFiles(): number;
/** Number of files that have been loaded */
get loadedFileCount(): number;
/**
* Initialize the index from manifest metadata.
* This does NOT load any file contents - just organizes metadata.
*/
initFromManifest(ldbFiles: IFile[], logFiles: IFile[], newFileLevel?: number[], newFileNumber?: number[], newFileSmallest?: string[], newFileLargest?: string[], deletedFileNumber?: number[]): void;
/**
* Find files that might contain a specific key based on key range metadata.
* Returns files in priority order (LOG files first, then LDB by level).
*
* Note: This is a heuristic - if key ranges aren't available from manifest,
* all files are considered potential matches.
*/
findPotentialFilesForKey(key: string): Array<ILevelDbFileIndex | ILevelDbLogIndex>;
/**
* Get files that should be loaded for initial chunk enumeration.
* This returns a subset of files that contain chunk metadata keys
* (keys that are 9-14 bytes, which identify chunk coordinates).
*
* Returns files in the order they should be processed for correct supercession.
*/
getFilesForChunkEnumeration(): Array<ILevelDbFileIndex | ILevelDbLogIndex>;
/**
* Mark a file as loaded.
*/
markFileLoaded(file: IFile): void;
/**
* Check if all files have been loaded.
*/
isFullyLoaded(): boolean;
/**
* Get unloaded files in priority order for background loading.
*/
getUnloadedFiles(): Array<ILevelDbFileIndex | ILevelDbLogIndex>;
}