UNPKG

@firesystem/memory

Version:

In-memory implementation of Virtual File System

1 lines 35 kB
{"version":3,"sources":["../src/index.ts","../src/MemoryFileSystem.ts"],"sourcesContent":["export { MemoryFileSystem } from \"./MemoryFileSystem\";\nexport type { MemoryFileSystemOptions } from \"./types\";\n","import type {\n IFileSystem,\n IReactiveFileSystem,\n FileEntry,\n FileStat,\n FileMetadata,\n FSEvent,\n Disposable,\n FileSystemEventPayloads,\n IFileSystemCapabilities,\n} from \"@firesystem/core\";\nimport {\n normalizePath,\n dirname,\n basename,\n join,\n TypedEventEmitter,\n FileSystemEvents,\n BaseFileSystem,\n} from \"@firesystem/core\";\nimport type { MemoryFileSystemOptions } from \"./types\";\n\ninterface MemoryFile {\n path: string;\n type: \"file\" | \"directory\";\n content?: any;\n size: number;\n created: Date;\n modified: Date;\n metadata?: FileMetadata;\n parent: string;\n}\n\ninterface WatchListener {\n id: string;\n pattern: string;\n callback: (event: FSEvent) => void;\n}\n\nexport class MemoryFileSystem extends BaseFileSystem {\n private files: Map<string, MemoryFile> = new Map();\n private watchers: WatchListener[] = [];\n public readonly events = new TypedEventEmitter<FileSystemEventPayloads>();\n\n // Capabilities do sistema em memória\n readonly capabilities: IFileSystemCapabilities = {\n readonly: false,\n caseSensitive: true,\n atomicRename: true,\n supportsWatch: true,\n supportsMetadata: true,\n maxFileSize: 50 * 1024 * 1024, // 50MB limite prático\n maxPathLength: 1024\n };\n\n constructor(options?: MemoryFileSystemOptions) {\n super();\n // Create root directory\n this.files.set(\"/\", {\n path: \"/\",\n type: \"directory\",\n size: 0,\n created: new Date(),\n modified: new Date(),\n parent: \"\",\n });\n\n // Add initial files if provided\n if (options?.initialFiles) {\n for (const file of options.initialFiles) {\n const normalized = normalizePath(file.path);\n this.files.set(normalized, {\n path: normalized,\n type: file.type,\n content: file.content,\n size: file.size || this.calculateSize(file.content),\n created: file.created || new Date(),\n modified: file.modified || new Date(),\n metadata: file.metadata,\n parent: dirname(normalized),\n });\n }\n }\n }\n\n async initialize(): Promise<void> {\n const startTime = Date.now();\n this.events.emit(FileSystemEvents.INITIALIZING, undefined as any);\n\n try {\n // Get all files except root\n const allFiles = Array.from(this.files.values()).filter(\n (f) => f.path !== \"/\",\n );\n const totalFiles = allFiles.length;\n\n // Emit events for each file\n for (let i = 0; i < allFiles.length; i++) {\n const file = allFiles[i];\n\n // Emit individual file events\n if (file.type === \"file\") {\n this.events.emit(FileSystemEvents.FILE_READ, {\n path: file.path,\n size: file.size,\n });\n } else {\n // For directories, count children\n const childCount = Array.from(this.files.values()).filter(\n (f) => f.parent === file.path,\n ).length;\n\n this.events.emit(FileSystemEvents.DIR_READ, {\n path: file.path,\n count: childCount,\n });\n }\n\n // Emit progress\n this.events.emit(FileSystemEvents.INIT_PROGRESS, {\n loaded: i + 1,\n total: totalFiles,\n phase: \"loading-files\",\n });\n }\n\n this.events.emit(FileSystemEvents.INITIALIZED, {\n duration: Date.now() - startTime,\n });\n } catch (error) {\n this.events.emit(FileSystemEvents.INIT_ERROR, {\n error: error as Error,\n });\n throw error;\n }\n }\n\n async readFile(path: string): Promise<FileEntry> {\n const normalized = normalizePath(path);\n const startTime = Date.now();\n const operationId = `read-${normalized}-${startTime}`;\n\n this.events.emit(FileSystemEvents.OPERATION_START, {\n operation: \"readFile\",\n path: normalized,\n id: operationId,\n });\n this.events.emit(FileSystemEvents.FILE_READING, { path: normalized });\n\n try {\n const file = this.files.get(normalized);\n\n if (!file) {\n throw new Error(`ENOENT: no such file or directory, open '${path}'`);\n }\n\n if (file.type === \"directory\") {\n throw new Error(\n `EISDIR: illegal operation on a directory, read '${path}'`,\n );\n }\n\n const result = {\n path: file.path,\n name: basename(file.path),\n type: file.type,\n size: file.size,\n created: file.created,\n modified: file.modified,\n metadata: file.metadata,\n content: file.content,\n };\n\n this.events.emit(FileSystemEvents.FILE_READ, {\n path: normalized,\n size: file.size,\n });\n this.events.emit(FileSystemEvents.OPERATION_END, {\n operation: \"readFile\",\n path: normalized,\n id: operationId,\n duration: Date.now() - startTime,\n });\n\n return result;\n } catch (error) {\n this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n operation: \"readFile\",\n path: normalized,\n error: error as Error,\n });\n throw error;\n }\n }\n\n async writeFile(\n path: string,\n content: any,\n metadata?: FileMetadata,\n ): Promise<FileEntry> {\n const normalized = normalizePath(path);\n const startTime = Date.now();\n const operationId = `write-${normalized}-${startTime}`;\n const size = this.calculateSize(content);\n\n this.events.emit(FileSystemEvents.OPERATION_START, {\n operation: \"writeFile\",\n path: normalized,\n id: operationId,\n });\n this.events.emit(FileSystemEvents.FILE_WRITING, { path: normalized, size });\n\n try {\n // Ensure parent directory exists\n await this.ensureParentExists(normalized);\n\n const existing = this.files.get(normalized);\n const now = new Date();\n\n const file: MemoryFile = {\n path: normalized,\n type: \"file\",\n content,\n size,\n created: existing?.created || now,\n modified: now,\n metadata,\n parent: dirname(normalized),\n };\n\n const isUpdate = !!existing;\n this.files.set(normalized, file);\n\n const result = {\n path: file.path,\n name: basename(file.path),\n type: file.type,\n size: file.size,\n created: file.created,\n modified: file.modified,\n metadata: file.metadata,\n content: file.content,\n };\n\n // Notify watchers\n this.notifyWatchers({\n type: isUpdate ? \"updated\" : \"created\",\n path: normalized,\n timestamp: now,\n });\n\n this.events.emit(FileSystemEvents.FILE_WRITTEN, {\n path: normalized,\n size,\n });\n this.events.emit(FileSystemEvents.OPERATION_END, {\n operation: \"writeFile\",\n path: normalized,\n id: operationId,\n duration: Date.now() - startTime,\n });\n\n return result;\n } catch (error) {\n this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n operation: \"writeFile\",\n path: normalized,\n error: error as Error,\n });\n throw error;\n }\n }\n\n async deleteFile(path: string): Promise<void> {\n const normalized = normalizePath(path);\n const file = this.files.get(normalized);\n\n if (!file) {\n throw new Error(`ENOENT: no such file or directory, unlink '${path}'`);\n }\n\n if (file.type === \"directory\") {\n // Check if directory is empty\n const hasChildren = Array.from(this.files.values()).some(\n (f) => f.parent === normalized,\n );\n if (hasChildren) {\n throw new Error(`ENOTEMPTY: directory not empty, rmdir '${path}'`);\n }\n }\n\n this.files.delete(normalized);\n\n // Notify watchers\n this.notifyWatchers({\n type: \"deleted\",\n path: normalized,\n timestamp: new Date(),\n });\n }\n\n async exists(path: string): Promise<boolean> {\n const normalized = normalizePath(path);\n return this.files.has(normalized);\n }\n\n async readDir(path: string): Promise<FileEntry[]> {\n const normalized = normalizePath(path);\n\n // Check if directory exists\n if (normalized !== \"/\" && !this.files.has(normalized)) {\n throw new Error(`ENOENT: no such file or directory, scandir '${path}'`);\n }\n\n const entries: FileEntry[] = [];\n\n for (const file of this.files.values()) {\n if (file.parent === normalized) {\n entries.push({\n path: file.path,\n name: basename(file.path),\n type: file.type,\n size: file.size,\n created: file.created,\n modified: file.modified,\n metadata: file.metadata,\n });\n }\n }\n\n return entries;\n }\n\n async mkdir(path: string, recursive: boolean = false): Promise<FileEntry> {\n const normalized = normalizePath(path);\n\n if (normalized === \"/\") {\n throw new Error(`EEXIST: file already exists, mkdir '${path}'`);\n }\n\n if (this.files.has(normalized)) {\n throw new Error(`EEXIST: file already exists, mkdir '${path}'`);\n }\n\n const parent = dirname(normalized);\n if (!recursive && parent !== \"/\" && !this.files.has(parent)) {\n throw new Error(`ENOENT: no such file or directory, mkdir '${path}'`);\n }\n\n // Create parent directories if recursive\n if (recursive && parent !== \"/\" && !this.files.has(parent)) {\n await this.mkdir(parent, true);\n }\n\n const now = new Date();\n const dir: MemoryFile = {\n path: normalized,\n type: \"directory\",\n size: 0,\n created: now,\n modified: now,\n parent: dirname(normalized),\n };\n\n this.files.set(normalized, dir);\n\n // Notify watchers\n this.notifyWatchers({\n type: \"created\",\n path: normalized,\n timestamp: now,\n });\n\n return {\n path: dir.path,\n name: basename(dir.path),\n type: dir.type,\n size: 0,\n created: now,\n modified: now,\n };\n }\n\n async rmdir(path: string, recursive: boolean = false): Promise<void> {\n const normalized = normalizePath(path);\n\n if (normalized === \"/\") {\n throw new Error(`EBUSY: resource busy or locked, rmdir '${path}'`);\n }\n\n const file = this.files.get(normalized);\n if (!file) {\n throw new Error(`ENOENT: no such file or directory, rmdir '${path}'`);\n }\n\n if (file.type !== \"directory\") {\n throw new Error(`ENOTDIR: not a directory, rmdir '${path}'`);\n }\n\n const contents = await this.readDir(normalized);\n if (contents.length > 0 && !recursive) {\n throw new Error(`ENOTEMPTY: directory not empty, rmdir '${path}'`);\n }\n\n if (recursive) {\n // Delete all contents recursively\n await this.deleteRecursive(normalized);\n }\n\n // Delete the directory itself\n this.files.delete(normalized);\n\n // Notify watchers\n this.notifyWatchers({\n type: \"deleted\",\n path: normalized,\n timestamp: new Date(),\n });\n }\n\n async rename(oldPath: string, newPath: string): Promise<FileEntry> {\n const oldNormalized = normalizePath(oldPath);\n const newNormalized = normalizePath(newPath);\n\n const file = this.files.get(oldNormalized);\n if (!file) {\n throw new Error(`ENOENT: no such file or directory, rename '${oldPath}'`);\n }\n\n // Ensure new parent exists\n await this.ensureParentExists(newNormalized);\n\n // Check if new path already exists\n if (this.files.has(newNormalized)) {\n throw new Error(\n `EEXIST: file already exists, rename '${oldPath}' -> '${newPath}'`,\n );\n }\n\n const now = new Date();\n\n // If it's a directory, update all children\n if (file.type === \"directory\") {\n const toUpdate: Array<[string, MemoryFile]> = [];\n\n // Collect all files to update\n for (const [path, f] of this.files) {\n if (path === oldNormalized || path.startsWith(oldNormalized + \"/\")) {\n const newFilePath = path.replace(oldNormalized, newNormalized);\n toUpdate.push([\n path,\n {\n ...f,\n path: newFilePath,\n parent: dirname(newFilePath),\n modified: path === oldNormalized ? now : f.modified,\n },\n ]);\n }\n }\n\n // Delete old entries and add new ones\n for (const [oldPath] of toUpdate) {\n this.files.delete(oldPath);\n }\n for (const [, newFile] of toUpdate) {\n this.files.set(newFile.path, newFile);\n }\n\n // Get the renamed directory entry\n const renamedDir = this.files.get(newNormalized)!;\n\n // Notify watchers\n this.notifyWatchers({\n type: \"renamed\",\n path: newNormalized,\n oldPath: oldNormalized,\n timestamp: now,\n });\n\n return {\n path: renamedDir.path,\n name: basename(renamedDir.path),\n type: renamedDir.type,\n size: renamedDir.size,\n created: renamedDir.created,\n modified: renamedDir.modified,\n metadata: renamedDir.metadata,\n };\n } else {\n // It's a file, simpler case\n const newFile: MemoryFile = {\n ...file,\n path: newNormalized,\n parent: dirname(newNormalized),\n modified: now,\n };\n\n this.files.delete(oldNormalized);\n this.files.set(newNormalized, newFile);\n\n // Notify watchers\n this.notifyWatchers({\n type: \"renamed\",\n path: newNormalized,\n oldPath: oldNormalized,\n timestamp: now,\n });\n\n return {\n path: newFile.path,\n name: basename(newFile.path),\n type: newFile.type,\n size: newFile.size,\n created: newFile.created,\n modified: newFile.modified,\n metadata: newFile.metadata,\n content: newFile.content,\n };\n }\n }\n\n async move(sourcePaths: string[], targetPath: string): Promise<void> {\n const targetNormalized = normalizePath(targetPath);\n\n // Ensure target is a directory\n const target = this.files.get(targetNormalized);\n if (!target || target.type !== \"directory\") {\n throw new Error(`ENOTDIR: not a directory, move to '${targetPath}'`);\n }\n\n for (const sourcePath of sourcePaths) {\n const name = basename(sourcePath);\n const newPath = join(targetNormalized, name);\n await this.rename(sourcePath, newPath);\n }\n }\n\n async copy(sourcePath: string, targetPath: string): Promise<FileEntry> {\n const sourceNormalized = normalizePath(sourcePath);\n const source = this.files.get(sourceNormalized);\n\n if (!source) {\n throw new Error(\n `ENOENT: no such file or directory, open '${sourcePath}'`,\n );\n }\n\n if (source.type === \"directory\") {\n throw new Error(\n `EISDIR: illegal operation on a directory, read '${sourcePath}'`,\n );\n }\n\n return this.writeFile(targetPath, source.content, source.metadata);\n }\n\n watch(pattern: string, callback: (event: FSEvent) => void): Disposable {\n const id = this.generateWatcherId();\n const listener: WatchListener = { id, pattern, callback };\n\n this.watchers.push(listener);\n\n return {\n dispose: () => {\n const index = this.watchers.findIndex((w) => w.id === id);\n if (index !== -1) {\n this.watchers.splice(index, 1);\n }\n },\n };\n }\n\n async stat(path: string): Promise<FileStat> {\n const normalized = normalizePath(path);\n const file = this.files.get(normalized);\n\n if (!file) {\n throw new Error(`ENOENT: no such file or directory, stat '${path}'`);\n }\n\n return {\n path: file.path,\n size: file.size,\n type: file.type,\n created: file.created,\n modified: file.modified,\n readonly: false, // Sempre false em memória\n };\n }\n\n async glob(pattern: string): Promise<string[]> {\n const paths: string[] = [];\n\n for (const file of this.files.values()) {\n if (this.matchesPattern(file.path, pattern)) {\n paths.push(file.path);\n }\n }\n\n return paths.sort();\n }\n\n async clear(): Promise<void> {\n const startTime = Date.now();\n const operationId = `clear-${startTime}`;\n\n this.events.emit(FileSystemEvents.OPERATION_START, {\n operation: \"clear\",\n id: operationId,\n });\n this.events.emit(FileSystemEvents.STORAGE_CLEARING, undefined as any);\n\n try {\n this.files.clear();\n\n // Recreate root directory\n this.files.set(\"/\", {\n path: \"/\",\n type: \"directory\",\n size: 0,\n created: new Date(),\n modified: new Date(),\n parent: \"\",\n });\n\n const duration = Date.now() - startTime;\n this.events.emit(FileSystemEvents.STORAGE_CLEARED, { duration });\n this.events.emit(FileSystemEvents.OPERATION_END, {\n operation: \"clear\",\n id: operationId,\n duration,\n });\n } catch (error) {\n this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n operation: \"clear\",\n error: error as Error,\n });\n throw error;\n }\n }\n\n async size(): Promise<number> {\n const startTime = Date.now();\n const operationId = `size-${startTime}`;\n\n this.events.emit(FileSystemEvents.OPERATION_START, {\n operation: \"size\",\n id: operationId,\n });\n\n try {\n let totalSize = 0;\n\n for (const file of this.files.values()) {\n totalSize += file.size;\n }\n\n this.events.emit(FileSystemEvents.STORAGE_SIZE_CALCULATED, {\n size: totalSize,\n });\n this.events.emit(FileSystemEvents.OPERATION_END, {\n operation: \"size\",\n id: operationId,\n duration: Date.now() - startTime,\n });\n\n return totalSize;\n } catch (error) {\n this.events.emit(FileSystemEvents.OPERATION_ERROR, {\n operation: \"size\",\n error: error as Error,\n });\n throw error;\n }\n }\n\n // Helper methods\n\n private calculateSize(content: any): number {\n if (content === null || content === undefined) {\n return 0;\n }\n if (typeof content === \"string\") {\n // UTF-16 encoding (JavaScript strings)\n return content.length * 2;\n }\n if (content instanceof ArrayBuffer) {\n return content.byteLength;\n }\n if (typeof content === \"object\") {\n return JSON.stringify(content).length * 2;\n }\n return 0;\n }\n\n private async ensureParentExists(path: string): Promise<void> {\n const parent = dirname(path);\n if (parent === \"/\" || parent === path) return;\n\n if (!this.files.has(parent)) {\n throw new Error(`ENOENT: no such file or directory, open '${path}'`);\n }\n }\n\n private async deleteRecursive(path: string): Promise<void> {\n const toDelete: string[] = [];\n\n // Collect all descendants\n for (const file of this.files.values()) {\n if (file.path.startsWith(path + \"/\")) {\n toDelete.push(file.path);\n }\n }\n\n // Sort by path length descending (delete children first)\n toDelete.sort((a, b) => b.length - a.length);\n\n // Delete all children\n for (const filePath of toDelete) {\n this.files.delete(filePath);\n }\n }\n\n private matchesPattern(path: string, pattern: string): boolean {\n // Handle simple cases\n if (pattern === \"**\" || pattern === \"**/*\") {\n return true;\n }\n\n if (pattern === \"*\") {\n // * should only match files in root directory\n return path.split(\"/\").length === 2 && path !== \"/\";\n }\n\n // Convert glob pattern to regex\n let regex = pattern\n // Escape special regex characters except glob ones\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n // Handle ** (matches any number of directories)\n .replace(/\\*\\*/g, \"___GLOBSTAR___\")\n // Handle * (matches any characters except /)\n .replace(/\\*/g, \"[^/]*\")\n // Handle ? (matches single character except /)\n .replace(/\\?/g, \"[^/]\")\n // Restore ** handling\n .replace(/___GLOBSTAR___\\//g, \"(.*/)?\")\n .replace(/\\/___GLOBSTAR___/g, \"(/.*)?\")\n .replace(/___GLOBSTAR___/g, \".*\");\n\n // Anchor the pattern\n regex = \"^\" + regex + \"$\";\n\n return new RegExp(regex).test(path);\n }\n\n private notifyWatchers(event: FSEvent): void {\n for (const watcher of this.watchers) {\n if (this.matchesPattern(event.path, watcher.pattern)) {\n try {\n watcher.callback(event);\n } catch (error) {\n console.error(\n `Error in watch callback for pattern \"${watcher.pattern}\":`,\n error,\n );\n }\n }\n }\n }\n\n private generateWatcherId(): string {\n return `watch_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n // Sobrescrever métodos de permissão (sempre permitido em memória)\n async canModify(path: string): Promise<boolean> {\n return true; // Sempre permitido em memória\n }\n\n async canCreateIn(parentPath: string): Promise<boolean> {\n try {\n const stat = await this.stat(parentPath);\n return stat.type === \"directory\";\n } catch {\n // Se não existe, verifica se é o root\n return normalizePath(parentPath) === \"/\";\n }\n }\n\n // writeFileAtomic já está implementado na classe base\n // Mas podemos otimizar para memória\n async writeFileAtomic(\n path: string,\n content: any,\n metadata?: FileMetadata\n ): Promise<FileEntry> {\n // Em memória, podemos fazer atomicamente sem arquivo temp\n return this.writeFile(path, content, metadata);\n }\n}\n"],"mappings":"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","names":["oldPath"]}