UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

102 lines (101 loc) 3.9 kB
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>; }