import IFile from "./IFile.js"; import ILevelDbFileInfo from "./ILevelDbFileInfo.js"; /** * 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; } /** * 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; /** Deleted file numbers from manifest */ deletedFileNumbers: Set; /** Total number of files in the index */ get totalFiles(): 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; }