@componentor/fs 1.2.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +398 -634
- package/dist/index.cjs +2637 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +606 -0
- package/dist/index.d.ts +539 -481
- package/dist/index.js +2358 -2480
- package/dist/index.js.map +1 -1
- package/dist/kernel.js +496 -0
- package/dist/kernel.js.map +1 -0
- package/package.json +39 -45
- package/dist/opfs-hybrid.d.ts +0 -198
- package/dist/opfs-hybrid.js +0 -2743
- package/dist/opfs-hybrid.js.map +0 -1
- package/dist/opfs-worker-proxy.d.ts +0 -224
- package/dist/opfs-worker-proxy.js +0 -274
- package/dist/opfs-worker-proxy.js.map +0 -1
- package/dist/opfs-worker.js +0 -2923
- package/dist/opfs-worker.js.map +0 -1
- package/src/constants.ts +0 -52
- package/src/errors.ts +0 -88
- package/src/file-handle.ts +0 -100
- package/src/global.d.ts +0 -57
- package/src/handle-manager.ts +0 -302
- package/src/index.ts +0 -1416
- package/src/opfs-hybrid.ts +0 -265
- package/src/opfs-worker-proxy.ts +0 -374
- package/src/opfs-worker.ts +0 -253
- package/src/packed-storage.ts +0 -604
- package/src/path-utils.ts +0 -97
- package/src/streams.ts +0 -109
- package/src/symlink-manager.ts +0 -338
- package/src/types.ts +0 -289
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/path-utils.ts","../src/handle-manager.ts","../src/symlink-manager.ts","../src/packed-storage.ts","../src/file-handle.ts","../src/streams.ts","../src/opfs-worker-proxy.ts","../src/opfs-hybrid.ts","../src/index.ts"],"names":["position","name"],"mappings":"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","file":"index.js","sourcesContent":["import type { FSConstants } from './types.js'\n\n/**\n * File system constants matching Node.js fs.constants\n */\nexport const constants: FSConstants = {\n // File access modes\n F_OK: 0,\n R_OK: 4,\n W_OK: 2,\n X_OK: 1,\n\n // Copy file flags\n COPYFILE_EXCL: 1,\n COPYFILE_FICLONE: 2,\n COPYFILE_FICLONE_FORCE: 4,\n\n // File open flags\n O_RDONLY: 0,\n O_WRONLY: 1,\n O_RDWR: 2,\n O_CREAT: 64,\n O_EXCL: 128,\n O_TRUNC: 512,\n O_APPEND: 1024,\n\n // File type masks\n S_IFMT: 61440,\n S_IFREG: 32768,\n S_IFDIR: 16384,\n S_IFLNK: 40960\n}\n\n/**\n * Convert numeric flags to string representation\n */\nexport function flagsToString(flags: number | string): string {\n if (typeof flags === 'string') return flags\n\n const map: Record<number, string> = {\n [constants.O_RDONLY]: 'r',\n [constants.O_WRONLY]: 'w',\n [constants.O_RDWR]: 'r+',\n [constants.O_CREAT | constants.O_WRONLY]: 'w',\n [constants.O_CREAT | constants.O_WRONLY | constants.O_TRUNC]: 'w',\n [constants.O_CREAT | constants.O_RDWR]: 'w+',\n [constants.O_APPEND | constants.O_WRONLY]: 'a',\n [constants.O_APPEND | constants.O_RDWR]: 'a+'\n }\n\n return map[flags] || 'r'\n}\n","/**\n * Custom error class for filesystem errors\n */\nexport class FSError extends Error {\n code: string\n syscall?: string\n path?: string\n original?: Error\n\n constructor(message: string, code: string, options?: { syscall?: string; path?: string; original?: Error }) {\n super(message)\n this.name = 'FSError'\n this.code = code\n this.syscall = options?.syscall\n this.path = options?.path\n this.original = options?.original\n }\n}\n\n/**\n * Create ENOENT (No such file or directory) error\n */\nexport function createENOENT(path: string): FSError {\n return new FSError(`ENOENT: No such file or directory, '${path}'`, 'ENOENT', { path })\n}\n\n/**\n * Create EEXIST (File exists) error\n */\nexport function createEEXIST(path: string, operation?: string): FSError {\n const message = operation\n ? `EEXIST: file already exists, ${operation} '${path}'`\n : `EEXIST: File exists, '${path}'`\n return new FSError(message, 'EEXIST', { path })\n}\n\n/**\n * Create EACCES (Permission denied) error\n */\nexport function createEACCES(path: string, syscall?: string): FSError {\n return new FSError(`EACCES: permission denied, access '${path}'`, 'EACCES', { syscall, path })\n}\n\n/**\n * Create EISDIR (Is a directory) error\n */\nexport function createEISDIR(path: string, operation = 'operation'): FSError {\n return new FSError(`EISDIR: illegal operation on a directory, ${operation} '${path}'`, 'EISDIR', { path })\n}\n\n/**\n * Create ELOOP (Too many symbolic links) error\n */\nexport function createELOOP(path: string): FSError {\n return new FSError(`ELOOP: Too many symbolic links, '${path}'`, 'ELOOP', { path })\n}\n\n/**\n * Create EINVAL (Invalid argument) error\n */\nexport function createEINVAL(path: string): FSError {\n return new FSError(`EINVAL: Invalid argument, '${path}'`, 'EINVAL', { path })\n}\n\n/**\n * Create ECORRUPTED (Data corruption detected) error\n */\nexport function createECORRUPTED(path: string): FSError {\n return new FSError(`ECORRUPTED: Pack file integrity check failed, '${path}'`, 'ECORRUPTED', { path })\n}\n\n/**\n * Wrap an error with a standard code if it doesn't have one\n */\nexport function wrapError(err: unknown): FSError {\n if (err instanceof FSError) return err\n\n const error = err as Error\n if (typeof (error as FSError).code === 'string') {\n const fsErr = new FSError(error.message, (error as FSError).code)\n fsErr.original = error\n return fsErr\n }\n\n const wrapped = new FSError(error.message || 'Unknown error', 'UNKNOWN')\n wrapped.original = error\n return wrapped\n}\n","// Path normalization cache - LRU-style with max size\nconst normalizeCache = new Map<string, string>()\nconst CACHE_MAX_SIZE = 1000\n\n/**\n * Normalize a path, handling . and .. components\n * Results are cached for performance on repeated calls\n */\nexport function normalize(path: string | undefined | null): string {\n if (path === undefined || path === null) {\n throw new TypeError('Path cannot be undefined or null')\n }\n\n if (typeof path !== 'string') {\n throw new TypeError(`Expected string path, got ${typeof path}`)\n }\n\n if (path === '') {\n return '/'\n }\n\n // Check cache first\n const cached = normalizeCache.get(path)\n if (cached !== undefined) {\n return cached\n }\n\n const parts = path.split('/')\n const stack: string[] = []\n\n for (const part of parts) {\n if (part === '' || part === '.') {\n continue\n } else if (part === '..') {\n if (stack.length > 0) stack.pop()\n } else {\n stack.push(part)\n }\n }\n\n const result = '/' + stack.join('/')\n\n // Cache the result (simple LRU: clear when full)\n if (normalizeCache.size >= CACHE_MAX_SIZE) {\n // Delete oldest entries (first 25%)\n const deleteCount = CACHE_MAX_SIZE / 4\n let count = 0\n for (const key of normalizeCache.keys()) {\n if (count++ >= deleteCount) break\n normalizeCache.delete(key)\n }\n }\n normalizeCache.set(path, result)\n\n return result\n}\n\n/**\n * Get parent directory path\n */\nexport function dirname(path: string): string {\n const normalized = normalize(path)\n const parts = normalized.split('/').filter(Boolean)\n if (parts.length < 2) return '/'\n return '/' + parts.slice(0, -1).join('/')\n}\n\n/**\n * Get base filename\n */\nexport function basename(path: string): string {\n const normalized = normalize(path)\n const parts = normalized.split('/').filter(Boolean)\n return parts[parts.length - 1] || ''\n}\n\n/**\n * Join path segments\n */\nexport function join(...paths: string[]): string {\n return normalize(paths.join('/'))\n}\n\n/**\n * Check if path is root\n */\nexport function isRoot(path: string): boolean {\n const normalized = normalize(path)\n return normalized === '/' || normalized === ''\n}\n\n/**\n * Get path segments (excluding empty)\n */\nexport function segments(path: string): string[] {\n return normalize(path).split('/').filter(Boolean)\n}\n","import { normalize, segments, dirname } from './path-utils.js'\nimport { createENOENT } from './errors.js'\n\nexport interface HandleResult {\n dir: FileSystemDirectoryHandle\n name: string\n fileHandle: FileSystemFileHandle | null\n dirHandle: FileSystemDirectoryHandle | null\n}\n\nexport interface GetHandleOptions {\n create?: boolean\n kind?: 'file' | 'directory'\n}\n\nconst FILE_HANDLE_POOL_SIZE = 50\nconst DIR_CACHE_MAX_SIZE = 200\n\n/**\n * Simple in-memory lock for preventing concurrent sync access handle creation\n * within the same JavaScript context. This is needed because sync access handles\n * are exclusive per file - only one can exist at a time.\n *\n * Optimized for the uncontended case (no Promise creation when lock is free).\n */\nclass FileLock {\n private active = new Set<string>()\n private queues = new Map<string, Array<() => void>>()\n\n async acquire(path: string): Promise<() => void> {\n if (!this.active.has(path)) {\n // Fast path: no contention, just mark as active\n this.active.add(path)\n return this.createRelease(path)\n }\n\n // Slow path: wait in queue\n await new Promise<void>(resolve => {\n let queue = this.queues.get(path)\n if (!queue) {\n queue = []\n this.queues.set(path, queue)\n }\n queue.push(resolve)\n })\n\n return this.createRelease(path)\n }\n\n private createRelease(path: string): () => void {\n return () => {\n const queue = this.queues.get(path)\n if (queue && queue.length > 0) {\n // Pass ownership to next waiter\n const next = queue.shift()!\n if (queue.length === 0) {\n this.queues.delete(path)\n }\n next()\n } else {\n // No waiters, release the lock\n this.active.delete(path)\n }\n }\n }\n}\n\n/** Global file lock instance for sync access handle serialization */\nexport const fileLock = new FileLock()\n\n/**\n * Manages OPFS handles with caching for improved performance\n */\nexport class HandleManager {\n private rootPromise: Promise<FileSystemDirectoryHandle>\n private dirCache: Map<string, FileSystemDirectoryHandle> = new Map()\n private fileHandlePool: Map<string, FileSystemFileHandle> = new Map()\n\n constructor() {\n this.rootPromise = navigator.storage.getDirectory()\n }\n\n /**\n * Get the root directory handle\n */\n async getRoot(): Promise<FileSystemDirectoryHandle> {\n return this.rootPromise\n }\n\n /**\n * Cache a directory handle with LRU eviction\n */\n private cacheDirHandle(path: string, handle: FileSystemDirectoryHandle): void {\n if (this.dirCache.size >= DIR_CACHE_MAX_SIZE) {\n // Delete oldest entry (first key in Map maintains insertion order)\n const firstKey = this.dirCache.keys().next().value\n if (firstKey) this.dirCache.delete(firstKey)\n }\n this.dirCache.set(path, handle)\n }\n\n /**\n * Clear directory cache for a path and its children\n */\n clearCache(path = ''): void {\n const normalizedPath = normalize(path)\n\n // For root path, just clear everything\n if (normalizedPath === '/' || normalizedPath === '') {\n this.dirCache.clear()\n this.fileHandlePool.clear()\n return\n }\n\n // Clear directory cache\n if (this.dirCache.size > 0) {\n for (const key of this.dirCache.keys()) {\n if (key === normalizedPath || key.startsWith(normalizedPath + '/')) {\n this.dirCache.delete(key)\n }\n }\n }\n\n // Clear file handle pool for affected paths\n if (this.fileHandlePool.size > 0) {\n for (const key of this.fileHandlePool.keys()) {\n if (key === normalizedPath || key.startsWith(normalizedPath + '/')) {\n this.fileHandlePool.delete(key)\n }\n }\n }\n }\n\n /**\n * Get a file handle from the pool or create a new one\n */\n async getPooledFileHandle(path: string, create = false): Promise<FileSystemFileHandle | null> {\n const normalizedPath = normalize(path)\n\n // Check pool first\n const pooled = this.fileHandlePool.get(normalizedPath)\n if (pooled) {\n return pooled\n }\n\n // Get handle the normal way\n const { fileHandle } = await this.getHandle(normalizedPath, { create })\n if (!fileHandle) return null\n\n // Add to pool with LRU eviction\n if (this.fileHandlePool.size >= FILE_HANDLE_POOL_SIZE) {\n // Delete oldest entry (first key in Map maintains insertion order)\n const firstKey = this.fileHandlePool.keys().next().value\n if (firstKey) this.fileHandlePool.delete(firstKey)\n }\n this.fileHandlePool.set(normalizedPath, fileHandle)\n\n return fileHandle\n }\n\n /**\n * Invalidate a specific file handle from the pool\n */\n invalidateFileHandle(path: string): void {\n const normalizedPath = normalize(path)\n this.fileHandlePool.delete(normalizedPath)\n }\n\n /**\n * Get file or directory handle for a path\n */\n async getHandle(path: string, opts: GetHandleOptions = {}): Promise<HandleResult> {\n // Use segments() for optimized path parsing (leverages normalize cache)\n const parts = segments(path)\n\n // Handle root or empty path\n if (parts.length === 0) {\n const root = await this.rootPromise\n return { dir: root, name: '', fileHandle: null, dirHandle: root }\n }\n\n let dir = await this.rootPromise\n let currentPath = ''\n\n // Navigate to parent directory using cache\n for (let i = 0; i < parts.length - 1; i++) {\n currentPath += '/' + parts[i]\n\n // Check cache first for better performance\n if (this.dirCache.has(currentPath)) {\n dir = this.dirCache.get(currentPath)!\n continue\n }\n\n try {\n dir = await dir.getDirectoryHandle(parts[i], { create: opts.create })\n this.cacheDirHandle(currentPath, dir)\n } catch {\n throw createENOENT(path)\n }\n }\n\n const name = parts[parts.length - 1]\n\n try {\n if (opts.kind === 'directory') {\n const dirHandle = await dir.getDirectoryHandle(name, { create: opts.create })\n return { dir, name, fileHandle: null, dirHandle }\n } else {\n const fileHandle = await dir.getFileHandle(name, { create: opts.create })\n return { dir, name, fileHandle, dirHandle: null }\n }\n } catch {\n if (!opts.create) {\n return { dir, name, fileHandle: null, dirHandle: null }\n }\n throw createENOENT(path)\n }\n }\n\n /**\n * Get directory handle with caching\n */\n async getDirectoryHandle(path: string): Promise<FileSystemDirectoryHandle> {\n const normalizedPath = normalize(path)\n\n if (normalizedPath === '/' || normalizedPath === '') {\n return this.rootPromise\n }\n\n // Check cache first\n if (this.dirCache.has(normalizedPath)) {\n return this.dirCache.get(normalizedPath)!\n }\n\n const parts = segments(normalizedPath)\n let dir = await this.rootPromise\n let currentPath = ''\n\n for (const part of parts) {\n currentPath += '/' + part\n\n if (this.dirCache.has(currentPath)) {\n dir = this.dirCache.get(currentPath)!\n continue\n }\n\n dir = await dir.getDirectoryHandle(part)\n this.cacheDirHandle(currentPath, dir)\n }\n\n return dir\n }\n\n /**\n * Ensure parent directory exists\n */\n async ensureParentDir(path: string): Promise<void> {\n const parentPath = dirname(path)\n if (parentPath === '/' || parentPath === '') return\n\n const parts = segments(parentPath)\n let dir = await this.rootPromise\n let currentPath = ''\n\n for (const part of parts) {\n currentPath += '/' + part\n\n // Check cache first for better performance\n if (this.dirCache.has(currentPath)) {\n dir = this.dirCache.get(currentPath)!\n continue\n }\n\n dir = await dir.getDirectoryHandle(part, { create: true })\n this.cacheDirHandle(currentPath, dir)\n }\n }\n\n /**\n * Create directory (with automatic parent creation)\n */\n async mkdir(path: string): Promise<void> {\n const normalizedPath = normalize(path)\n this.clearCache(normalizedPath)\n\n const parts = segments(normalizedPath)\n let dir = await this.rootPromise\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n const subPath = '/' + parts.slice(0, i + 1).join('/')\n\n if (this.dirCache.has(subPath)) {\n dir = this.dirCache.get(subPath)!\n } else {\n dir = await dir.getDirectoryHandle(part, { create: true })\n this.cacheDirHandle(subPath, dir)\n }\n }\n }\n}\n","import type { SymlinkCache, SymlinkDefinition } from './types.js'\nimport type { HandleManager } from './handle-manager.js'\nimport { fileLock } from './handle-manager.js'\nimport { normalize } from './path-utils.js'\nimport { createELOOP, createEINVAL, createEEXIST } from './errors.js'\n\nconst SYMLINK_FILE = '/.opfs-symlinks.json'\nconst MAX_SYMLINK_DEPTH = 10\n\n/**\n * Manages symbolic link emulation using a JSON metadata file\n */\nexport class SymlinkManager {\n private cache: SymlinkCache | null = null\n private cacheCount = 0 // Track count to avoid Object.keys() calls\n private resolvedCache: Map<string, string> = new Map() // Cache resolved paths\n private dirty = false\n private handleManager: HandleManager\n private useSync: boolean\n private loadPromise: Promise<SymlinkCache> | null = null // Avoid multiple concurrent loads\n private diskLoaded = false // Track if we've loaded from disk\n\n constructor(handleManager: HandleManager, useSync: boolean) {\n this.handleManager = handleManager\n this.useSync = useSync\n // Initialize with empty cache - most operations won't need symlinks\n this.cache = {}\n this.cacheCount = 0\n }\n\n /**\n * Reset all symlink state (called when root directory is cleared)\n */\n reset(): void {\n this.cache = {}\n this.cacheCount = 0\n this.resolvedCache.clear()\n this.dirty = false\n this.loadPromise = null\n this.diskLoaded = false\n }\n\n /**\n * Load symlinks from metadata file\n * Uses loadPromise to avoid multiple concurrent disk reads\n */\n async load(): Promise<SymlinkCache> {\n // Fast path: if we've already loaded from disk, use cached data\n if (this.diskLoaded) return this.cache!\n\n // If there's already a load in progress, wait for it\n if (this.loadPromise) return this.loadPromise\n\n // Load from disk\n this.loadPromise = this.loadFromDisk()\n const result = await this.loadPromise\n this.loadPromise = null\n return result\n }\n\n /**\n * Actually read from disk\n */\n private async loadFromDisk(): Promise<SymlinkCache> {\n try {\n const { fileHandle } = await this.handleManager.getHandle(SYMLINK_FILE)\n if (!fileHandle) {\n // No symlink file exists - keep empty cache\n this.diskLoaded = true\n return this.cache!\n }\n\n const file = await fileHandle.getFile()\n const text = await file.text()\n this.cache = JSON.parse(text)\n this.cacheCount = Object.keys(this.cache).length\n this.diskLoaded = true\n } catch {\n // Error reading - keep empty cache\n if (!this.cache) {\n this.cache = {}\n this.cacheCount = 0\n }\n this.diskLoaded = true\n }\n\n return this.cache!\n }\n\n /**\n * Save symlinks to metadata file\n */\n async save(): Promise<void> {\n if (!this.cache) return\n\n // Use compact JSON (no formatting) for better performance\n const data = JSON.stringify(this.cache)\n const { fileHandle } = await this.handleManager.getHandle(SYMLINK_FILE, { create: true })\n\n if (!fileHandle) return\n\n const buffer = new TextEncoder().encode(data)\n\n if (this.useSync) {\n const release = await fileLock.acquire(SYMLINK_FILE)\n try {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n access.truncate(0)\n let written = 0\n while (written < buffer.length) {\n written += access.write(buffer.subarray(written), { at: written })\n }\n } finally {\n access.close()\n }\n } finally {\n release()\n }\n } else {\n const writable = await fileHandle.createWritable()\n await writable.write(buffer)\n await writable.close()\n }\n\n this.dirty = false\n }\n\n /**\n * Flush pending changes if dirty\n */\n async flush(): Promise<void> {\n if (this.dirty) {\n await this.save()\n }\n }\n\n /**\n * Resolve a path through symlinks\n * Fast synchronous path when cache is already loaded\n * Uses resolved cache for O(1) repeated lookups\n *\n * OPTIMIZATION: If we haven't loaded from disk yet AND no symlinks have been\n * created in this session, we skip the disk check entirely. This makes pure\n * file operations (no symlinks) very fast.\n */\n async resolve(path: string, maxDepth = MAX_SYMLINK_DEPTH): Promise<string> {\n // Ultra-fast path: if no symlinks exist in memory, return immediately\n // This covers both: (1) fresh session with no symlinks, (2) loaded from disk with no symlinks\n if (this.cacheCount === 0) {\n // If we've loaded from disk and it's empty, we're done\n // If we haven't loaded from disk, assume no symlinks until a symlink op is called\n return path\n }\n\n // We have symlinks in memory - resolve them\n // Check resolved cache first for instant lookup\n const cached = this.resolvedCache.get(path)\n if (cached !== undefined) {\n return cached\n }\n return this.resolveSync(path, this.cache!, maxDepth)\n }\n\n /**\n * Synchronous resolution helper - caches the result\n */\n private resolveSync(path: string, symlinks: SymlinkCache, maxDepth: number): string {\n let currentPath = path\n let depth = 0\n\n while (symlinks[currentPath] && depth < maxDepth) {\n currentPath = symlinks[currentPath]\n depth++\n }\n\n if (depth >= maxDepth) {\n throw createELOOP(path)\n }\n\n // Cache the resolved path if it was actually a symlink\n if (currentPath !== path) {\n this.resolvedCache.set(path, currentPath)\n }\n\n return currentPath\n }\n\n /**\n * Clear the resolved path cache (called when symlinks change)\n */\n private clearResolvedCache(): void {\n this.resolvedCache.clear()\n }\n\n /**\n * Check if a path is a symlink\n */\n async isSymlink(path: string): Promise<boolean> {\n const symlinks = await this.load()\n return !!symlinks[path]\n }\n\n /**\n * Get symlink target\n */\n async readlink(path: string): Promise<string> {\n const normalizedPath = normalize(path)\n const symlinks = await this.load()\n\n if (!symlinks[normalizedPath]) {\n throw createEINVAL(path)\n }\n\n return symlinks[normalizedPath]\n }\n\n /**\n * Create a symlink\n */\n async symlink(target: string, path: string, checkExists: () => Promise<void>): Promise<void> {\n const normalizedPath = normalize(path)\n const normalizedTarget = normalize(target)\n\n const symlinks = await this.load()\n\n if (symlinks[normalizedPath]) {\n throw createEEXIST(normalizedPath)\n }\n\n await checkExists()\n\n symlinks[normalizedPath] = normalizedTarget\n this.cacheCount++\n this.clearResolvedCache() // Invalidate resolved cache\n this.dirty = true\n await this.flush()\n }\n\n /**\n * Create multiple symlinks efficiently\n */\n async symlinkBatch(\n links: SymlinkDefinition[],\n checkExists: (path: string) => Promise<void>\n ): Promise<void> {\n const symlinks = await this.load()\n\n // Prepare all normalized paths first\n const normalizedLinks = links.map(({ target, path }) => ({\n normalizedPath: normalize(path),\n normalizedTarget: normalize(target)\n }))\n\n // Check for existing symlinks in memory (fast)\n for (const { normalizedPath } of normalizedLinks) {\n if (symlinks[normalizedPath]) {\n throw createEEXIST(normalizedPath)\n }\n }\n\n // Check filesystem existence in parallel (I/O bound)\n await Promise.all(normalizedLinks.map(({ normalizedPath }) => checkExists(normalizedPath)))\n\n // Add all symlinks at once\n for (const { normalizedPath, normalizedTarget } of normalizedLinks) {\n symlinks[normalizedPath] = normalizedTarget\n }\n\n this.cacheCount += links.length\n this.clearResolvedCache() // Invalidate resolved cache\n this.dirty = true\n await this.flush()\n }\n\n /**\n * Remove a symlink\n */\n async unlink(path: string): Promise<boolean> {\n const symlinks = await this.load()\n\n if (symlinks[path]) {\n delete symlinks[path]\n this.cacheCount--\n this.clearResolvedCache() // Invalidate resolved cache\n this.dirty = true\n await this.flush()\n return true\n }\n\n return false\n }\n\n /**\n * Rename/move a symlink\n */\n async rename(oldPath: string, newPath: string): Promise<boolean> {\n const symlinks = await this.load()\n\n if (symlinks[oldPath]) {\n const target = symlinks[oldPath]\n delete symlinks[oldPath]\n symlinks[newPath] = target\n this.clearResolvedCache() // Invalidate resolved cache\n this.dirty = true\n await this.flush()\n return true\n }\n\n return false\n }\n\n /**\n * Get all symlinks in a directory\n */\n async getSymlinksInDir(dirPath: string): Promise<string[]> {\n const symlinks = await this.load()\n const result: string[] = []\n\n for (const symlinkPath of Object.keys(symlinks)) {\n const parts = symlinkPath.split('/').filter(Boolean)\n const parentPath = '/' + parts.slice(0, -1).join('/')\n\n if (parentPath === dirPath || (dirPath === '/' && parts.length === 1)) {\n result.push(parts[parts.length - 1])\n }\n }\n\n return result\n }\n\n /**\n * Check if path is the symlink metadata file\n */\n isMetadataFile(name: string): boolean {\n return name === SYMLINK_FILE.replace(/^\\/+/, '')\n }\n}\n","/**\n * Packed Storage - Stores multiple files in a single OPFS file\n *\n * Instead of creating 100 separate files (100 OPFS API calls),\n * we write all data to one pack file with an index (1-2 API calls).\n *\n * Format:\n * [index length: 4 bytes][CRC32: 4 bytes][JSON index][file data...]\n *\n * Index format:\n * { \"path\": { offset: number, size: number, originalSize?: number }, ... }\n *\n * When originalSize is present, data is compressed (size = compressed, originalSize = uncompressed)\n * CRC32 is calculated over [JSON index][file data...] for integrity verification.\n */\n\nimport type { HandleManager } from './handle-manager.js'\nimport { fileLock } from './handle-manager.js'\nimport { createECORRUPTED } from './errors.js'\n\n// ============ Compression ============\n// Uses browser's native CompressionStream API\n\nasync function compress(data: Uint8Array): Promise<Uint8Array> {\n // Skip compression for small data (overhead not worth it)\n if (data.length < 100) return data\n\n try {\n const stream = new CompressionStream('gzip')\n const writer = stream.writable.getWriter()\n writer.write(data)\n writer.close()\n\n const chunks: Uint8Array[] = []\n const reader = stream.readable.getReader()\n let totalSize = 0\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(value)\n totalSize += value.length\n }\n\n // Only use compressed if it's actually smaller\n if (totalSize >= data.length) return data\n\n const result = new Uint8Array(totalSize)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.length\n }\n return result\n } catch {\n // Compression not available, return original\n return data\n }\n}\n\nasync function decompress(data: Uint8Array): Promise<Uint8Array> {\n // Decompression MUST succeed for compressed data - throw on failure\n const stream = new DecompressionStream('gzip')\n const writer = stream.writable.getWriter()\n writer.write(data)\n writer.close()\n\n const chunks: Uint8Array[] = []\n const reader = stream.readable.getReader()\n let totalSize = 0\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(value)\n totalSize += value.length\n }\n\n const result = new Uint8Array(totalSize)\n let offset = 0\n for (const chunk of chunks) {\n result.set(chunk, offset)\n offset += chunk.length\n }\n return result\n}\n\n// ============ CRC32 ============\n\n// CRC32 lookup table (pre-computed for performance)\nconst CRC32_TABLE = new Uint32Array(256)\nfor (let i = 0; i < 256; i++) {\n let c = i\n for (let j = 0; j < 8; j++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1\n }\n CRC32_TABLE[i] = c\n}\n\n/**\n * Calculate CRC32 checksum of data\n */\nfunction crc32(data: Uint8Array): number {\n let crc = 0xffffffff\n for (let i = 0; i < data.length; i++) {\n crc = CRC32_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8)\n }\n return (crc ^ 0xffffffff) >>> 0\n}\n\n// ============ Types ============\n\ninterface PackIndexEntry {\n offset: number\n size: number\n originalSize?: number // Present if compressed\n}\n\ninterface PackIndex {\n [path: string]: PackIndexEntry\n}\n\nconst PACK_FILE = '/.opfs-pack'\n\nexport class PackedStorage {\n private handleManager: HandleManager\n private useSync: boolean\n private useCompression: boolean\n private useChecksum: boolean\n private index: PackIndex | null = null\n private indexLoaded = false\n\n constructor(handleManager: HandleManager, useSync: boolean, useCompression = false, useChecksum = true) {\n this.handleManager = handleManager\n this.useSync = useSync\n // Only enable compression if API is available\n this.useCompression = useCompression && typeof CompressionStream !== 'undefined'\n this.useChecksum = useChecksum\n }\n\n /**\n * Reset pack storage state (memory only)\n */\n reset(): void {\n this.index = null\n this.indexLoaded = false\n }\n\n /**\n * Clear pack storage completely (deletes pack file from disk)\n */\n async clear(): Promise<void> {\n this.index = null\n this.indexLoaded = false\n\n try {\n const root = await this.handleManager.getRoot()\n await root.removeEntry(PACK_FILE.replace(/^\\//, ''))\n } catch {\n // Pack file doesn't exist, that's fine\n }\n }\n\n /**\n * Load pack index from disk (always reloads to support hybrid mode)\n * Verifies CRC32 checksum for integrity\n * Note: Caller must hold the lock\n */\n private async loadIndex(): Promise<PackIndex> {\n try {\n const { fileHandle } = await this.handleManager.getHandle(PACK_FILE)\n if (!fileHandle) {\n return {}\n }\n\n if (this.useSync) {\n const release = await fileLock.acquire(PACK_FILE)\n try {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n const size = access.getSize()\n if (size < 8) {\n return {}\n }\n\n // Read header: index length + CRC32\n const header = new Uint8Array(8)\n access.read(header, { at: 0 })\n const view = new DataView(header.buffer)\n const indexLen = view.getUint32(0, true)\n const storedCrc = view.getUint32(4, true)\n\n // Read everything after header (index + data) for CRC verification\n const contentSize = size - 8\n const content = new Uint8Array(contentSize)\n access.read(content, { at: 8 })\n\n // Verify CRC32 if enabled\n if (this.useChecksum && storedCrc !== 0) {\n const calculatedCrc = crc32(content)\n if (calculatedCrc !== storedCrc) {\n throw createECORRUPTED(PACK_FILE)\n }\n }\n\n // Parse index from content\n const indexJson = new TextDecoder().decode(content.subarray(0, indexLen))\n return JSON.parse(indexJson)\n } finally {\n access.close()\n }\n } finally {\n release()\n }\n } else {\n const file = await fileHandle.getFile()\n const data = new Uint8Array(await file.arrayBuffer())\n if (data.length < 8) {\n return {}\n }\n\n const view = new DataView(data.buffer)\n const indexLen = view.getUint32(0, true)\n const storedCrc = view.getUint32(4, true)\n\n // Verify CRC32 over content (everything after header) if enabled\n const content = data.subarray(8)\n if (this.useChecksum && storedCrc !== 0) {\n const calculatedCrc = crc32(content)\n if (calculatedCrc !== storedCrc) {\n throw createECORRUPTED(PACK_FILE)\n }\n }\n\n const indexJson = new TextDecoder().decode(content.subarray(0, indexLen))\n return JSON.parse(indexJson)\n }\n } catch {\n return {}\n }\n }\n\n /**\n * Check if a path exists in the pack\n */\n async has(path: string): Promise<boolean> {\n const index = await this.loadIndex()\n return path in index\n }\n\n /**\n * Get file size from pack (for stat)\n * Returns originalSize if compressed, otherwise size\n */\n async getSize(path: string): Promise<number | null> {\n const index = await this.loadIndex()\n const entry = index[path]\n if (!entry) return null\n return entry.originalSize ?? entry.size\n }\n\n /**\n * Read a file from the pack\n * Handles decompression if file was stored compressed\n */\n async read(path: string): Promise<Uint8Array | null> {\n const index = await this.loadIndex()\n const entry = index[path]\n if (!entry) return null\n\n const { fileHandle } = await this.handleManager.getHandle(PACK_FILE)\n if (!fileHandle) return null\n\n let buffer: Uint8Array\n\n if (this.useSync) {\n const release = await fileLock.acquire(PACK_FILE)\n try {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n buffer = new Uint8Array(entry.size)\n access.read(buffer, { at: entry.offset })\n } finally {\n access.close()\n }\n } finally {\n release()\n }\n } else {\n const file = await fileHandle.getFile()\n const data = new Uint8Array(await file.arrayBuffer())\n buffer = data.slice(entry.offset, entry.offset + entry.size)\n }\n\n // Decompress if needed\n if (entry.originalSize !== undefined) {\n return decompress(buffer)\n }\n\n return buffer\n }\n\n /**\n * Read multiple files from the pack in a single operation\n * Loads index once, reads all data in parallel\n * Handles decompression if files were stored compressed\n */\n async readBatch(paths: string[]): Promise<Map<string, Uint8Array | null>> {\n const results = new Map<string, Uint8Array | null>()\n if (paths.length === 0) return results\n\n const index = await this.loadIndex()\n\n // Find which paths are in the pack\n const toRead: Array<{ path: string; offset: number; size: number; originalSize?: number }> = []\n for (const path of paths) {\n const entry = index[path]\n if (entry) {\n toRead.push({ path, offset: entry.offset, size: entry.size, originalSize: entry.originalSize })\n } else {\n results.set(path, null)\n }\n }\n\n if (toRead.length === 0) return results\n\n const { fileHandle } = await this.handleManager.getHandle(PACK_FILE)\n if (!fileHandle) {\n for (const { path } of toRead) {\n results.set(path, null)\n }\n return results\n }\n\n // Read all files\n const decompressPromises: Array<{ path: string; promise: Promise<Uint8Array> }> = []\n\n if (this.useSync) {\n const release = await fileLock.acquire(PACK_FILE)\n try {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n for (const { path, offset, size, originalSize } of toRead) {\n const buffer = new Uint8Array(size)\n access.read(buffer, { at: offset })\n\n if (originalSize !== undefined) {\n // Queue for decompression\n decompressPromises.push({ path, promise: decompress(buffer) })\n } else {\n results.set(path, buffer)\n }\n }\n } finally {\n access.close()\n }\n } finally {\n release()\n }\n } else {\n const file = await fileHandle.getFile()\n const data = new Uint8Array(await file.arrayBuffer())\n for (const { path, offset, size, originalSize } of toRead) {\n const buffer = data.slice(offset, offset + size)\n\n if (originalSize !== undefined) {\n decompressPromises.push({ path, promise: decompress(buffer) })\n } else {\n results.set(path, buffer)\n }\n }\n }\n\n // Wait for all decompressions\n for (const { path, promise } of decompressPromises) {\n results.set(path, await promise)\n }\n\n return results\n }\n\n /**\n * Write multiple files to the pack in a single operation\n * This is the key optimization - 100 files become 1 write!\n * Includes CRC32 checksum for integrity verification.\n * Optionally compresses data for smaller storage.\n * Note: This replaces the entire pack with the new entries\n */\n async writeBatch(entries: Array<{ path: string; data: Uint8Array }>): Promise<void> {\n if (entries.length === 0) return\n\n const encoder = new TextEncoder()\n\n // Compress data if enabled\n let processedEntries: Array<{ path: string; data: Uint8Array; originalSize?: number }>\n if (this.useCompression) {\n processedEntries = await Promise.all(\n entries.map(async ({ path, data }) => {\n const compressed = await compress(data)\n // Only use compressed if it's actually smaller\n if (compressed.length < data.length) {\n return { path, data: compressed, originalSize: data.length }\n }\n return { path, data }\n })\n )\n } else {\n processedEntries = entries\n }\n\n // Calculate total data size (using compressed sizes where applicable)\n let totalDataSize = 0\n for (const { data } of processedEntries) {\n totalDataSize += data.length\n }\n\n // Build index - iterate until offsets stabilize\n // (offset changes -> JSON length changes -> header size changes -> offset changes)\n // Header format: [index length: 4][CRC32: 4][JSON index][file data...]\n const newIndex: PackIndex = {}\n let headerSize = 8 // 4 bytes index length + 4 bytes CRC32\n let prevHeaderSize = 0\n\n // Iterate until stable (usually 2-3 iterations)\n while (headerSize !== prevHeaderSize) {\n prevHeaderSize = headerSize\n\n let currentOffset = headerSize\n for (const { path, data, originalSize } of processedEntries) {\n const entry: PackIndexEntry = { offset: currentOffset, size: data.length }\n if (originalSize !== undefined) {\n entry.originalSize = originalSize\n }\n newIndex[path] = entry\n currentOffset += data.length\n }\n\n const indexBuf = encoder.encode(JSON.stringify(newIndex))\n headerSize = 8 + indexBuf.length\n }\n\n // Build the complete pack file\n const finalIndexBuf = encoder.encode(JSON.stringify(newIndex))\n const totalSize = headerSize + totalDataSize\n const packBuffer = new Uint8Array(totalSize)\n const view = new DataView(packBuffer.buffer)\n\n // Write index JSON at offset 8\n packBuffer.set(finalIndexBuf, 8)\n\n // Write data at correct offsets\n for (const { path, data } of processedEntries) {\n const entry = newIndex[path]\n packBuffer.set(data, entry.offset)\n }\n\n // Calculate CRC32 over content (index + data, everything after header) if enabled\n const content = packBuffer.subarray(8)\n const checksum = this.useChecksum ? crc32(content) : 0\n\n // Write header (index length + CRC32)\n view.setUint32(0, finalIndexBuf.length, true)\n view.setUint32(4, checksum, true)\n\n await this.writePackFile(packBuffer)\n this.index = newIndex\n }\n\n /**\n * Write the pack file to OPFS\n * Note: Caller must hold the lock\n */\n private async writePackFile(data: Uint8Array): Promise<void> {\n const { fileHandle } = await this.handleManager.getHandle(PACK_FILE, { create: true })\n if (!fileHandle) return\n\n if (this.useSync) {\n const release = await fileLock.acquire(PACK_FILE)\n try {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n access.truncate(data.length)\n access.write(data, { at: 0 })\n } finally {\n access.close()\n }\n } finally {\n release()\n }\n } else {\n const writable = await fileHandle.createWritable()\n await writable.write(data)\n await writable.close()\n }\n }\n\n /**\n * Remove a path from the pack index\n * Note: Doesn't reclaim space, just removes from index and recalculates CRC32\n */\n async remove(path: string): Promise<boolean> {\n const index = await this.loadIndex()\n if (!(path in index)) return false\n\n delete index[path]\n\n const { fileHandle } = await this.handleManager.getHandle(PACK_FILE)\n if (!fileHandle) return true\n\n // Need to read existing file to recalculate CRC32\n const encoder = new TextEncoder()\n const newIndexBuf = encoder.encode(JSON.stringify(index))\n\n if (this.useSync) {\n const release = await fileLock.acquire(PACK_FILE)\n try {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n const size = access.getSize()\n\n // Read old header to get old index length\n const oldHeader = new Uint8Array(8)\n access.read(oldHeader, { at: 0 })\n const oldIndexLen = new DataView(oldHeader.buffer).getUint32(0, true)\n\n // Read data portion (after old index)\n const dataStart = 8 + oldIndexLen\n const dataSize = size - dataStart\n const dataPortion = new Uint8Array(dataSize)\n if (dataSize > 0) {\n access.read(dataPortion, { at: dataStart })\n }\n\n // Build new content (new index + data)\n const newContent = new Uint8Array(newIndexBuf.length + dataSize)\n newContent.set(newIndexBuf, 0)\n if (dataSize > 0) {\n newContent.set(dataPortion, newIndexBuf.length)\n }\n\n // Calculate new CRC32 if enabled\n const checksum = this.useChecksum ? crc32(newContent) : 0\n\n // Build new header\n const newHeader = new Uint8Array(8)\n const view = new DataView(newHeader.buffer)\n view.setUint32(0, newIndexBuf.length, true)\n view.setUint32(4, checksum, true)\n\n // Write new file\n const newFile = new Uint8Array(8 + newContent.length)\n newFile.set(newHeader, 0)\n newFile.set(newContent, 8)\n\n access.truncate(newFile.length)\n access.write(newFile, { at: 0 })\n } finally {\n access.close()\n }\n } finally {\n release()\n }\n } else {\n // For non-sync, rewrite the whole file\n const file = await fileHandle.getFile()\n const oldData = new Uint8Array(await file.arrayBuffer())\n\n if (oldData.length < 8) return true\n\n const oldIndexLen = new DataView(oldData.buffer).getUint32(0, true)\n const dataStart = 8 + oldIndexLen\n const dataPortion = oldData.subarray(dataStart)\n\n // Build new content\n const newContent = new Uint8Array(newIndexBuf.length + dataPortion.length)\n newContent.set(newIndexBuf, 0)\n newContent.set(dataPortion, newIndexBuf.length)\n\n // Calculate CRC32 if enabled\n const checksum = this.useChecksum ? crc32(newContent) : 0\n\n // Build new file\n const newFile = new Uint8Array(8 + newContent.length)\n const view = new DataView(newFile.buffer)\n view.setUint32(0, newIndexBuf.length, true)\n view.setUint32(4, checksum, true)\n newFile.set(newContent, 8)\n\n const writable = await fileHandle.createWritable()\n await writable.write(newFile)\n await writable.close()\n }\n\n return true\n }\n\n /**\n * Check if pack file is being used (has entries)\n */\n async isEmpty(): Promise<boolean> {\n const index = await this.loadIndex()\n return Object.keys(index).length === 0\n }\n}\n","import type { FileHandle, ReadResult, WriteResult, Stats, ReadFileOptions, WriteFileOptions } from './types.js'\n\nexport interface FileHandleContext {\n readFile(path: string, options?: ReadFileOptions): Promise<string | Uint8Array>\n writeFile(path: string, data: string | Uint8Array, options?: WriteFileOptions): Promise<void>\n appendFile(path: string, data: string | Uint8Array, options?: WriteFileOptions): Promise<void>\n stat(path: string): Promise<Stats>\n truncate(path: string, len: number): Promise<void>\n}\n\n/**\n * Create a FileHandle-like object for the open() method\n */\nexport function createFileHandle(\n resolvedPath: string,\n initialPosition: number,\n context: FileHandleContext\n): FileHandle {\n let position = initialPosition\n\n return {\n fd: Math.floor(Math.random() * 1000000),\n\n async read(\n buffer: Uint8Array,\n offset = 0,\n length = buffer.length,\n pos: number | null = null\n ): Promise<ReadResult> {\n const readPos = pos !== null ? pos : position\n const data = await context.readFile(resolvedPath) as Uint8Array\n const bytesToRead = Math.min(length, data.length - readPos)\n buffer.set(data.subarray(readPos, readPos + bytesToRead), offset)\n if (pos === null) position += bytesToRead\n return { bytesRead: bytesToRead, buffer }\n },\n\n async write(\n buffer: Uint8Array,\n offset = 0,\n length = buffer.length,\n pos: number | null = null\n ): Promise<WriteResult> {\n const writePos = pos !== null ? pos : position\n let existingData = new Uint8Array(0)\n\n try {\n existingData = await context.readFile(resolvedPath) as Uint8Array\n } catch (e) {\n if ((e as { code?: string }).code !== 'ENOENT') throw e\n }\n\n const dataToWrite = buffer.subarray(offset, offset + length)\n const newSize = Math.max(existingData.length, writePos + length)\n const newData = new Uint8Array(newSize)\n newData.set(existingData, 0)\n newData.set(dataToWrite, writePos)\n\n await context.writeFile(resolvedPath, newData)\n if (pos === null) position += length\n return { bytesWritten: length, buffer }\n },\n\n async close(): Promise<void> {\n // No-op for OPFS\n },\n\n async stat(): Promise<Stats> {\n return context.stat(resolvedPath)\n },\n\n async truncate(len = 0): Promise<void> {\n return context.truncate(resolvedPath, len)\n },\n\n async sync(): Promise<void> {\n // No-op for OPFS (writes are already persisted)\n },\n\n async datasync(): Promise<void> {\n // No-op for OPFS\n },\n\n async readFile(options?: ReadFileOptions): Promise<string | Uint8Array> {\n return context.readFile(resolvedPath, options)\n },\n\n async writeFile(data: string | Uint8Array, options?: WriteFileOptions): Promise<void> {\n return context.writeFile(resolvedPath, data, options)\n },\n\n async appendFile(data: string | Uint8Array, options?: WriteFileOptions): Promise<void> {\n return context.appendFile(resolvedPath, data, options)\n },\n\n [Symbol.asyncDispose]: async function(): Promise<void> {\n // No-op for OPFS\n }\n }\n}\n","import type { ReadStreamOptions, WriteStreamOptions } from './types.js'\n\nexport interface ReadStreamContext {\n readFile(path: string): Promise<Uint8Array>\n}\n\nexport interface WriteStreamContext {\n readFile(path: string): Promise<Uint8Array>\n writeFile(path: string, data: Uint8Array): Promise<void>\n}\n\n/**\n * Create a ReadableStream for reading file contents\n */\nexport function createReadStream(\n path: string,\n options: ReadStreamOptions,\n context: ReadStreamContext\n): ReadableStream<Uint8Array> {\n const { start = 0, end = Infinity, highWaterMark = 64 * 1024 } = options\n let position = start\n let closed = false\n let cachedData: Uint8Array | null = null\n\n return new ReadableStream({\n async pull(controller) {\n if (closed) {\n controller.close()\n return\n }\n\n try {\n // Cache file data on first read - avoid re-reading on every pull\n if (cachedData === null) {\n cachedData = await context.readFile(path)\n }\n\n const endPos = Math.min(end, cachedData.length)\n const chunk = cachedData.subarray(position, Math.min(position + highWaterMark, endPos))\n\n if (chunk.length === 0 || position >= endPos) {\n controller.close()\n closed = true\n cachedData = null // Release memory\n return\n }\n\n position += chunk.length\n controller.enqueue(chunk)\n } catch (err) {\n controller.error(err)\n }\n },\n cancel() {\n closed = true\n cachedData = null // Release memory\n }\n })\n}\n\n/**\n * Create a WritableStream for writing file contents\n */\nexport function createWriteStream(\n path: string,\n options: WriteStreamOptions,\n context: WriteStreamContext\n): WritableStream<Uint8Array> {\n const { flags = 'w', start = 0 } = options\n const chunks: Array<{ data: Uint8Array; position: number }> = []\n let position = start\n\n return new WritableStream({\n async write(chunk) {\n chunks.push({ data: chunk, position })\n position += chunk.length\n },\n\n async close() {\n // Combine all chunks\n let existingData = new Uint8Array(0)\n\n if (!flags.includes('w')) {\n try {\n existingData = await context.readFile(path)\n } catch (e) {\n if ((e as { code?: string }).code !== 'ENOENT') throw e\n }\n }\n\n let maxSize = existingData.length\n for (const { data, position } of chunks) {\n maxSize = Math.max(maxSize, position + data.length)\n }\n\n const finalData = new Uint8Array(maxSize)\n\n if (!flags.includes('w')) {\n finalData.set(existingData, 0)\n }\n\n for (const { data, position } of chunks) {\n finalData.set(data, position)\n }\n\n await context.writeFile(path, finalData)\n }\n })\n}\n","/**\n * OPFS Worker Proxy\n * Main thread class that communicates with an OPFS worker\n *\n * This allows non-blocking OPFS operations on the main thread\n * while the actual work happens in a dedicated Web Worker\n */\n\nimport type {\n ReadFileOptions,\n WriteFileOptions,\n BatchWriteEntry,\n BatchReadResult,\n ReaddirOptions,\n Dirent,\n Stats,\n StatFs,\n RmOptions,\n CpOptions,\n DiskUsage,\n SymlinkDefinition\n} from './types.js'\nimport { constants } from './constants.js'\nimport { FSError } from './errors.js'\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n}\n\ninterface WorkerResponse {\n id?: number\n type?: string\n result?: unknown\n error?: { message: string; code?: string }\n}\n\nexport interface OPFSWorkerOptions {\n /** URL to the worker script (default: auto-detect) */\n workerUrl?: string | URL\n /** Worker initialization options */\n workerOptions?: WorkerOptions\n}\n\n/**\n * OPFS Worker Proxy - runs OPFS operations in a Web Worker\n *\n * Benefits:\n * - Non-blocking main thread\n * - Uses sync access handles (faster) in the worker\n * - Compatible with libraries that reuse buffers (e.g., isomorphic-git)\n */\nexport class OPFSWorker {\n private worker: Worker | null = null\n private pendingRequests = new Map<number, PendingRequest>()\n private nextId = 1\n private readyPromise: Promise<void>\n private readyResolve!: () => void\n\n /** File system constants */\n public readonly constants = constants\n\n constructor(options: OPFSWorkerOptions = {}) {\n this.readyPromise = new Promise((resolve) => {\n this.readyResolve = resolve\n })\n\n this.initWorker(options)\n }\n\n private initWorker(options: OPFSWorkerOptions): void {\n const { workerUrl, workerOptions = { type: 'module' } } = options\n\n if (workerUrl) {\n this.worker = new Worker(workerUrl, workerOptions)\n } else {\n // Try to create worker from the bundled script\n // Users should provide workerUrl in production\n throw new Error(\n 'OPFSWorker requires a workerUrl option pointing to the worker script. ' +\n 'Example: new OPFSWorker({ workerUrl: new URL(\"./opfs-worker.js\", import.meta.url) })'\n )\n }\n\n this.worker.onmessage = (event: MessageEvent<WorkerResponse>) => {\n const { id, type, result, error } = event.data\n\n // Handle ready signal\n if (type === 'ready') {\n this.readyResolve()\n return\n }\n\n // Handle response to a request\n if (id !== undefined) {\n const pending = this.pendingRequests.get(id)\n if (pending) {\n this.pendingRequests.delete(id)\n if (error) {\n const fsError = new FSError(error.message, error.code || 'UNKNOWN')\n pending.reject(fsError)\n } else {\n pending.resolve(result)\n }\n }\n }\n }\n\n this.worker.onerror = (event) => {\n console.error('[OPFSWorker] Worker error:', event)\n }\n }\n\n /**\n * Wait for the worker to be ready\n */\n async ready(): Promise<void> {\n return this.readyPromise\n }\n\n /**\n * Terminate the worker\n */\n terminate(): void {\n if (this.worker) {\n this.worker.terminate()\n this.worker = null\n\n // Reject all pending requests\n for (const [, pending] of this.pendingRequests) {\n pending.reject(new Error('Worker terminated'))\n }\n this.pendingRequests.clear()\n }\n }\n\n private call<T>(method: string, args: unknown[], transfer?: Transferable[]): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.worker) {\n reject(new Error('Worker not initialized or terminated'))\n return\n }\n\n const id = this.nextId++\n this.pendingRequests.set(id, {\n resolve: resolve as (value: unknown) => void,\n reject\n })\n\n const message = { id, method, args }\n if (transfer && transfer.length > 0) {\n this.worker.postMessage(message, transfer)\n } else {\n this.worker.postMessage(message)\n }\n })\n }\n\n // File operations\n\n async readFile(path: string, options?: ReadFileOptions): Promise<string | Uint8Array> {\n const result = await this.call<string | Uint8Array>('readFile', [path, options])\n return result\n }\n\n async writeFile(path: string, data: string | Uint8Array, options?: WriteFileOptions): Promise<void> {\n // Note: We don't use Transferables here because the caller may reuse the buffer\n // (e.g., isomorphic-git reuses buffers). Structured cloning copies the data.\n await this.call<void>('writeFile', [path, data, options])\n }\n\n async readFileBatch(paths: string[]): Promise<BatchReadResult[]> {\n return this.call<BatchReadResult[]>('readFileBatch', [paths])\n }\n\n async writeFileBatch(entries: BatchWriteEntry[]): Promise<void> {\n // Note: We don't use Transferables here because the caller may reuse the buffers\n await this.call<void>('writeFileBatch', [entries])\n }\n\n async appendFile(path: string, data: string | Uint8Array, options?: WriteFileOptions): Promise<void> {\n // Note: We don't use Transferables here because the caller may reuse the buffer\n await this.call<void>('appendFile', [path, data, options])\n }\n\n async copyFile(src: string, dest: string, mode?: number): Promise<void> {\n await this.call<void>('copyFile', [src, dest, mode])\n }\n\n async unlink(path: string): Promise<void> {\n await this.call<void>('unlink', [path])\n }\n\n async truncate(path: string, len?: number): Promise<void> {\n await this.call<void>('truncate', [path, len])\n }\n\n // Directory operations\n\n async mkdir(path: string): Promise<void> {\n await this.call<void>('mkdir', [path])\n }\n\n async rmdir(path: string): Promise<void> {\n await this.call<void>('rmdir', [path])\n }\n\n async readdir(path: string, options?: ReaddirOptions): Promise<string[] | Dirent[]> {\n const result = await this.call<string[] | { name: string }[]>('readdir', [path, options])\n\n // Reconstruct Dirent objects with methods\n if (options?.withFileTypes && Array.isArray(result)) {\n return result.map((item) => {\n if (typeof item === 'object' && 'name' in item) {\n const entry = item as { name: string; _isFile?: boolean; _isDir?: boolean; _isSymlink?: boolean }\n return {\n name: entry.name,\n isFile: () => entry._isFile ?? false,\n isDirectory: () => entry._isDir ?? false,\n isSymbolicLink: () => entry._isSymlink ?? false\n }\n }\n return item as unknown as Dirent\n })\n }\n\n return result as string[]\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n await this.call<void>('cp', [src, dest, options])\n }\n\n async rm(path: string, options?: RmOptions): Promise<void> {\n await this.call<void>('rm', [path, options])\n }\n\n // Stat operations\n\n async stat(path: string): Promise<Stats> {\n const result = await this.call<{\n type: string\n size: number\n mode: number\n ctime: string\n ctimeMs: number\n mtime: string\n mtimeMs: number\n target?: string\n }>('stat', [path])\n\n return this.deserializeStats(result)\n }\n\n async lstat(path: string): Promise<Stats> {\n const result = await this.call<{\n type: string\n size: number\n mode: number\n ctime: string\n ctimeMs: number\n mtime: string\n mtimeMs: number\n target?: string\n }>('lstat', [path])\n\n return this.deserializeStats(result)\n }\n\n private deserializeStats(data: {\n type: string\n size: number\n mode: number\n ctime: string\n ctimeMs: number\n mtime: string\n mtimeMs: number\n target?: string\n }): Stats {\n const ctime = new Date(data.ctime)\n const mtime = new Date(data.mtime)\n\n return {\n type: data.type as 'file' | 'dir' | 'symlink',\n size: data.size,\n mode: data.mode,\n ctime,\n ctimeMs: data.ctimeMs,\n mtime,\n mtimeMs: data.mtimeMs,\n target: data.target,\n isFile: () => data.type === 'file',\n isDirectory: () => data.type === 'dir',\n isSymbolicLink: () => data.type === 'symlink'\n }\n }\n\n async exists(path: string): Promise<boolean> {\n return this.call<boolean>('exists', [path])\n }\n\n async access(path: string, mode?: number): Promise<void> {\n await this.call<void>('access', [path, mode])\n }\n\n async statfs(path?: string): Promise<StatFs> {\n return this.call<StatFs>('statfs', [path])\n }\n\n async du(path: string): Promise<DiskUsage> {\n return this.call<DiskUsage>('du', [path])\n }\n\n // Symlink operations\n\n async symlink(target: string, path: string): Promise<void> {\n await this.call<void>('symlink', [target, path])\n }\n\n async readlink(path: string): Promise<string> {\n return this.call<string>('readlink', [path])\n }\n\n async symlinkBatch(links: SymlinkDefinition[]): Promise<void> {\n await this.call<void>('symlinkBatch', [links])\n }\n\n async realpath(path: string): Promise<string> {\n return this.call<string>('realpath', [path])\n }\n\n // Other operations\n\n async rename(oldPath: string, newPath: string): Promise<void> {\n await this.call<void>('rename', [oldPath, newPath])\n }\n\n async mkdtemp(prefix: string): Promise<string> {\n return this.call<string>('mkdtemp', [prefix])\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n await this.call<void>('chmod', [path, mode])\n }\n\n async chown(path: string, uid: number, gid: number): Promise<void> {\n await this.call<void>('chown', [path, uid, gid])\n }\n\n async utimes(path: string, atime: Date | number, mtime: Date | number): Promise<void> {\n await this.call<void>('utimes', [path, atime, mtime])\n }\n\n async lutimes(path: string, atime: Date | number, mtime: Date | number): Promise<void> {\n await this.call<void>('lutimes', [path, atime, mtime])\n }\n\n /**\n * Reset internal caches to free memory\n * Useful for long-running benchmarks or after bulk operations\n */\n async resetCache(): Promise<void> {\n await this.call<void>('resetCache', [])\n }\n\n /**\n * Force full garbage collection by reinitializing the OPFS instance in the worker\n * This completely releases all handles and caches, preventing memory leaks in long-running operations\n * More aggressive than resetCache() - use when resetCache() isn't sufficient\n */\n async gc(): Promise<void> {\n await this.call<void>('gc', [])\n }\n}\n","/**\n * OPFS Hybrid - Routes read/write operations to different backends\n *\n * Allows optimal performance by using:\n * - Main thread for reads (no message passing overhead)\n * - Worker for writes (sync access handles are faster)\n */\n\nimport OPFS from './index.js'\nimport { OPFSWorker } from './opfs-worker-proxy.js'\nimport type {\n ReadFileOptions,\n WriteFileOptions,\n BatchWriteEntry,\n BatchReadResult,\n ReaddirOptions,\n Stats,\n StatFs,\n RmOptions,\n CpOptions,\n SymlinkDefinition,\n DiskUsage\n} from './types.js'\n\nexport type Backend = 'main' | 'worker'\n\nexport interface OPFSHybridOptions {\n /** Backend for read operations (default: 'main') */\n read?: Backend\n /** Backend for write operations (default: 'worker') */\n write?: Backend\n /** Worker URL (required if using worker backend) */\n workerUrl?: URL | string\n /** Enable verbose logging */\n verbose?: boolean\n}\n\n/**\n * Hybrid OPFS implementation that routes operations to optimal backends\n */\nexport class OPFSHybrid {\n private mainFs: OPFS\n private workerFs: OPFSWorker | null = null\n private readBackend: Backend\n private writeBackend: Backend\n private workerUrl?: URL | string\n private workerReady: Promise<void> | null = null\n private verbose: boolean\n\n constructor(options: OPFSHybridOptions = {}) {\n this.readBackend = options.read ?? 'main'\n this.writeBackend = options.write ?? 'worker'\n this.workerUrl = options.workerUrl\n this.verbose = options.verbose ?? false\n\n // Always create main fs (needed for main backend or as fallback)\n this.mainFs = new OPFS({ useSync: false, verbose: this.verbose })\n\n // Create worker if needed\n if (this.readBackend === 'worker' || this.writeBackend === 'worker') {\n if (!this.workerUrl) {\n throw new Error('workerUrl is required when using worker backend')\n }\n this.workerFs = new OPFSWorker({ workerUrl: this.workerUrl })\n this.workerReady = this.workerFs.ready()\n }\n }\n\n /**\n * Wait for all backends to be ready\n */\n async ready(): Promise<void> {\n if (this.workerReady) {\n await this.workerReady\n }\n }\n\n /**\n * Terminate worker if active\n */\n terminate(): void {\n if (this.workerFs) {\n this.workerFs.terminate()\n this.workerFs = null\n }\n }\n\n private getReadFs(): OPFS | OPFSWorker {\n if (this.readBackend === 'worker' && this.workerFs) {\n return this.workerFs\n }\n return this.mainFs\n }\n\n private getWriteFs(): OPFS | OPFSWorker {\n if (this.writeBackend === 'worker' && this.workerFs) {\n return this.workerFs\n }\n return this.mainFs\n }\n\n // ============ Read Operations ============\n\n async readFile(path: string, options?: ReadFileOptions): Promise<Uint8Array | string> {\n return this.getReadFs().readFile(path, options)\n }\n\n async readFileBatch(paths: string[]): Promise<BatchReadResult[]> {\n return this.getReadFs().readFileBatch(paths)\n }\n\n async readdir(path: string, options?: ReaddirOptions): Promise<string[] | import('./types.js').Dirent[]> {\n return this.getReadFs().readdir(path, options)\n }\n\n async stat(path: string): Promise<Stats> {\n return this.getReadFs().stat(path)\n }\n\n async lstat(path: string): Promise<Stats> {\n return this.getReadFs().lstat(path)\n }\n\n async exists(path: string): Promise<boolean> {\n return this.getReadFs().exists(path)\n }\n\n async access(path: string, mode?: number): Promise<void> {\n return this.getReadFs().access(path, mode)\n }\n\n async readlink(path: string): Promise<string> {\n return this.getReadFs().readlink(path)\n }\n\n async realpath(path: string): Promise<string> {\n return this.getReadFs().realpath(path)\n }\n\n async statfs(path?: string): Promise<StatFs> {\n return this.getReadFs().statfs(path)\n }\n\n async du(path: string): Promise<DiskUsage> {\n return this.getReadFs().du(path)\n }\n\n // ============ Write Operations ============\n\n async writeFile(path: string, data: string | Uint8Array, options?: WriteFileOptions): Promise<void> {\n return this.getWriteFs().writeFile(path, data, options)\n }\n\n async writeFileBatch(entries: BatchWriteEntry[]): Promise<void> {\n return this.getWriteFs().writeFileBatch(entries)\n }\n\n async appendFile(path: string, data: string | Uint8Array, options?: WriteFileOptions): Promise<void> {\n return this.getWriteFs().appendFile(path, data, options)\n }\n\n async mkdir(path: string): Promise<void> {\n return this.getWriteFs().mkdir(path)\n }\n\n async rmdir(path: string): Promise<void> {\n // rmdir affects both backends' state\n if (this.readBackend !== this.writeBackend && this.workerFs) {\n // Clear via worker (does actual deletion and resets worker's symlink cache)\n await this.workerFs.rmdir(path)\n // Reset main thread's cache (no actual file operations, just cache invalidation)\n this.mainFs.resetCache()\n } else {\n return this.getWriteFs().rmdir(path)\n }\n }\n\n async unlink(path: string): Promise<void> {\n return this.getWriteFs().unlink(path)\n }\n\n async truncate(path: string, len?: number): Promise<void> {\n return this.getWriteFs().truncate(path, len)\n }\n\n async symlink(target: string, path: string): Promise<void> {\n // Symlinks affect both backends' symlink cache\n if (this.readBackend !== this.writeBackend && this.workerFs) {\n await this.workerFs.symlink(target, path)\n // Reset main thread's symlink cache so it reloads from disk\n this.mainFs.resetCache()\n } else {\n return this.getWriteFs().symlink(target, path)\n }\n }\n\n async symlinkBatch(symlinks: SymlinkDefinition[]): Promise<void> {\n if (this.readBackend !== this.writeBackend && this.workerFs) {\n await this.workerFs.symlinkBatch(symlinks)\n // Reset main thread's symlink cache so it reloads from disk\n this.mainFs.resetCache()\n } else {\n return this.getWriteFs().symlinkBatch(symlinks)\n }\n }\n\n async rename(oldPath: string, newPath: string): Promise<void> {\n return this.getWriteFs().rename(oldPath, newPath)\n }\n\n async copyFile(src: string, dest: string, mode?: number): Promise<void> {\n return this.getWriteFs().copyFile(src, dest, mode)\n }\n\n async cp(src: string, dest: string, options?: CpOptions): Promise<void> {\n return this.getWriteFs().cp(src, dest, options)\n }\n\n async rm(path: string, options?: RmOptions): Promise<void> {\n return this.getWriteFs().rm(path, options)\n }\n\n async chmod(path: string, mode: number): Promise<void> {\n return this.getWriteFs().chmod(path, mode)\n }\n\n async chown(path: string, uid: number, gid: number): Promise<void> {\n return this.getWriteFs().chown(path, uid, gid)\n }\n\n async utimes(path: string, atime: Date | number, mtime: Date | number): Promise<void> {\n return this.getWriteFs().utimes(path, atime, mtime)\n }\n\n async lutimes(path: string, atime: Date | number, mtime: Date | number): Promise<void> {\n return this.getWriteFs().lutimes(path, atime, mtime)\n }\n\n async mkdtemp(prefix: string): Promise<string> {\n return this.getWriteFs().mkdtemp(prefix)\n }\n\n /**\n * Reset internal caches on both backends\n */\n async resetCache(): Promise<void> {\n this.mainFs.resetCache()\n if (this.workerFs) {\n await this.workerFs.resetCache()\n }\n }\n\n /**\n * Force full garbage collection on both backends\n * More aggressive than resetCache() - reinitializes the worker's OPFS instance\n */\n async gc(): Promise<void> {\n this.mainFs.resetCache()\n if (this.workerFs) {\n await this.workerFs.gc()\n }\n }\n}\n\nexport default OPFSHybrid\n","import type {\n OPFSOptions,\n ReadFileOptions,\n WriteFileOptions,\n BatchWriteEntry,\n BatchReadResult,\n ReaddirOptions,\n Dirent,\n Stats,\n StatFs,\n RmOptions,\n CpOptions,\n WatchOptions,\n FSWatcher,\n ReadStreamOptions,\n WriteStreamOptions,\n FileHandle,\n Dir,\n DiskUsage,\n SymlinkDefinition,\n WatchCallback,\n WatchRegistration\n} from './types.js'\nimport { constants, flagsToString } from './constants.js'\nimport { createENOENT, createEEXIST, createEACCES, createEISDIR, wrapError } from './errors.js'\nimport { normalize, dirname, basename, join, isRoot, segments } from './path-utils.js'\nimport { HandleManager } from './handle-manager.js'\nimport { SymlinkManager } from './symlink-manager.js'\nimport { PackedStorage } from './packed-storage.js'\nimport { createFileHandle } from './file-handle.js'\nimport { createReadStream, createWriteStream } from './streams.js'\nimport { OPFSHybrid, type OPFSHybridOptions, type Backend } from './opfs-hybrid.js'\n\nexport { constants }\nexport * from './types.js'\nexport { OPFSHybrid, type OPFSHybridOptions, type Backend }\n\n/** Extended options that include hybrid mode support */\nexport interface OPFSExtendedOptions extends OPFSOptions {\n /** Worker script URL - when provided, enables hybrid mode (reads on main, writes on worker) */\n workerUrl?: URL | string\n /** Override read backend when using hybrid mode (default: 'main') */\n read?: Backend\n /** Override write backend when using hybrid mode (default: 'worker') */\n write?: Backend\n}\n\n/**\n * OPFS-based filesystem implementation compatible with Node.js fs/promises API\n *\n * When `workerUrl` is provided, automatically uses hybrid mode for optimal performance:\n * - Reads on main thread (no message passing overhead)\n * - Writes on worker (sync access handles are faster)\n */\nexport default class OPFS {\n private useSync: boolean\n private verbose: boolean\n private handleManager: HandleManager\n private symlinkManager: SymlinkManager\n private packedStorage: PackedStorage\n private watchCallbacks: Map<symbol, WatchRegistration> = new Map()\n private tmpCounter = 0\n\n /** Hybrid instance when workerUrl is provided */\n private hybrid: OPFSHybrid | null = null\n\n /** File system constants */\n public readonly constants = constants\n\n constructor(options: OPFSExtendedOptions = {}) {\n const { useSync = true, verbose = false, useCompression = false, useChecksum = true, workerUrl, read, write } = options\n this.verbose = verbose\n\n // If workerUrl is provided, use hybrid mode\n if (workerUrl) {\n this.hybrid = new OPFSHybrid({\n workerUrl,\n read: read ?? 'main',\n write: write ?? 'worker',\n verbose\n })\n // These won't be used in hybrid mode but need to be initialized\n this.useSync = false\n this.handleManager = new HandleManager()\n this.symlinkManager = new SymlinkManager(this.handleManager, false)\n this.packedStorage = new PackedStorage(this.handleManager, false, useCompression, useChecksum)\n } else {\n this.useSync = useSync && typeof FileSystemFileHandle !== 'undefined' &&\n 'createSyncAccessHandle' in FileSystemFileHandle.prototype\n this.handleManager = new HandleManager()\n this.symlinkManager = new SymlinkManager(this.handleManager, this.useSync)\n this.packedStorage = new PackedStorage(this.handleManager, this.useSync, useCompression, useChecksum)\n }\n }\n\n /**\n * Wait for the filesystem to be ready (only needed for hybrid mode)\n */\n async ready(): Promise<void> {\n if (this.hybrid) {\n await this.hybrid.ready()\n }\n }\n\n /**\n * Terminate any background workers (only needed for hybrid mode)\n */\n terminate(): void {\n if (this.hybrid) {\n this.hybrid.terminate()\n }\n }\n\n private log(method: string, ...args: unknown[]): void {\n if (this.verbose) {\n console.log(`[OPFS] ${method}:`, ...args)\n }\n }\n\n private logError(method: string, err: unknown): void {\n if (this.verbose) {\n console.error(`[OPFS] ${method} error:`, err)\n }\n }\n\n /**\n * Execute tasks with limited concurrency to avoid overwhelming the system\n * @param items - Array of items to process\n * @param maxConcurrent - Maximum number of concurrent operations (default: 10)\n * @param taskFn - Function to execute for each item\n */\n private async limitConcurrency<T>(\n items: T[],\n maxConcurrent: number,\n taskFn: (item: T) => Promise<void>\n ): Promise<void> {\n if (items.length === 0) return\n\n // For very small batches, run sequentially (minimal overhead)\n if (items.length <= 2) {\n for (const item of items) {\n await taskFn(item)\n }\n return\n }\n\n // For medium batches up to maxConcurrent, use Promise.all for true parallelism\n // This is optimal for browser where I/O can truly run in parallel\n if (items.length <= maxConcurrent) {\n await Promise.all(items.map(taskFn))\n return\n }\n\n // For large batches, use worker pool pattern to limit concurrency\n const queue = [...items]\n const workers = Array.from({ length: maxConcurrent }).map(async () => {\n while (queue.length) {\n const item = queue.shift()\n if (item !== undefined) await taskFn(item)\n }\n })\n await Promise.all(workers)\n }\n\n /**\n * Read file contents\n */\n async readFile(path: string, options: ReadFileOptions = {}): Promise<string | Uint8Array> {\n if (this.hybrid) {\n return this.hybrid.readFile(path, options)\n }\n\n this.log('readFile', path, options)\n try {\n const normalizedPath = normalize(path)\n const resolvedPath = await this.symlinkManager.resolve(normalizedPath)\n\n // Try individual file first (most common case)\n let fileHandle: FileSystemFileHandle | null = null\n try {\n fileHandle = await this.handleManager.getPooledFileHandle(resolvedPath)\n } catch {\n // File doesn't exist as individual file, will try packed storage\n }\n\n if (fileHandle) {\n let buffer: Uint8Array\n\n if (this.useSync) {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n const size = access.getSize()\n buffer = new Uint8Array(size)\n access.read(buffer)\n } finally {\n access.close()\n }\n } else {\n const file = await fileHandle.getFile()\n buffer = new Uint8Array(await file.arrayBuffer())\n }\n\n return options.encoding\n ? new TextDecoder(options.encoding).decode(buffer)\n : buffer\n }\n\n // Fall back to packed storage (for batch-written files)\n const packedData = await this.packedStorage.read(resolvedPath)\n if (packedData) {\n return options.encoding\n ? new TextDecoder(options.encoding).decode(packedData)\n : packedData\n }\n\n throw createENOENT(path)\n } catch (err) {\n this.logError('readFile', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Read multiple files efficiently in a batch operation\n * Uses packed storage batch read (single index load), falls back to individual files\n * Returns results in the same order as input paths\n */\n async readFileBatch(paths: string[]): Promise<BatchReadResult[]> {\n if (this.hybrid) {\n return this.hybrid.readFileBatch(paths)\n }\n\n this.log('readFileBatch', `${paths.length} files`)\n if (paths.length === 0) return []\n\n try {\n // Resolve all symlinks first\n const resolvedPaths = await Promise.all(\n paths.map(async (path) => {\n const normalizedPath = normalize(path)\n return this.symlinkManager.resolve(normalizedPath)\n })\n )\n\n // Try to read all from packed storage in one operation (single index load)\n const packedResults = await this.packedStorage.readBatch(resolvedPaths)\n\n // Pre-allocate results array\n const results: BatchReadResult[] = new Array(paths.length)\n const needsIndividualRead: Array<{ index: number; resolvedPath: string }> = []\n\n // Check which files were found in pack vs need individual read\n for (let i = 0; i < paths.length; i++) {\n const packedData = packedResults.get(resolvedPaths[i])\n if (packedData) {\n results[i] = { path: paths[i], data: packedData }\n } else {\n needsIndividualRead.push({ index: i, resolvedPath: resolvedPaths[i] })\n }\n }\n\n // Read remaining files individually\n if (needsIndividualRead.length > 0) {\n await Promise.all(\n needsIndividualRead.map(async ({ index, resolvedPath }) => {\n try {\n const fileHandle = await this.handleManager.getPooledFileHandle(resolvedPath)\n if (!fileHandle) {\n results[index] = { path: paths[index], data: null, error: createENOENT(paths[index]) }\n return\n }\n\n let buffer: Uint8Array\n if (this.useSync) {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n const size = access.getSize()\n buffer = new Uint8Array(size)\n access.read(buffer)\n } finally {\n access.close()\n }\n } else {\n const file = await fileHandle.getFile()\n buffer = new Uint8Array(await file.arrayBuffer())\n }\n results[index] = { path: paths[index], data: buffer }\n } catch (err) {\n results[index] = { path: paths[index], data: null, error: err as Error }\n }\n })\n )\n }\n\n return results\n } catch (err) {\n this.logError('readFileBatch', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Write data to a file\n */\n async writeFile(path: string, data: string | Uint8Array, options: WriteFileOptions = {}): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.writeFile(path, data, options)\n }\n\n this.log('writeFile', path)\n try {\n const normalizedPath = normalize(path)\n const resolvedPath = await this.symlinkManager.resolve(normalizedPath)\n\n const { fileHandle } = await this.handleManager.getHandle(resolvedPath, { create: true })\n const buffer = typeof data === 'string' ? new TextEncoder().encode(data) : data\n\n if (this.useSync) {\n const access = await fileHandle!.createSyncAccessHandle()\n try {\n // Set exact size (more efficient than truncate(0) + write)\n access.truncate(buffer.length)\n access.write(buffer, { at: 0 })\n } finally {\n access.close()\n }\n } else {\n const writable = await fileHandle!.createWritable()\n await writable.write(buffer)\n await writable.close()\n }\n } catch (err) {\n this.logError('writeFile', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Write multiple files efficiently in a batch operation\n * Uses packed storage (single file) for maximum performance\n */\n async writeFileBatch(entries: BatchWriteEntry[]): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.writeFileBatch(entries)\n }\n\n this.log('writeFileBatch', `${entries.length} files`)\n if (entries.length === 0) return\n\n try {\n // Reuse encoder for all string conversions\n const encoder = new TextEncoder()\n\n // Resolve all symlinks and convert data\n const packEntries = await Promise.all(\n entries.map(async ({ path, data }) => {\n const normalizedPath = normalize(path)\n const resolvedPath = await this.symlinkManager.resolve(normalizedPath)\n return {\n path: resolvedPath,\n data: typeof data === 'string' ? encoder.encode(data) : data\n }\n })\n )\n\n // Write all files to packed storage (single OPFS write!)\n await this.packedStorage.writeBatch(packEntries)\n } catch (err) {\n this.logError('writeFileBatch', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Create a directory\n */\n async mkdir(path: string): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.mkdir(path)\n }\n\n this.log('mkdir', path)\n try {\n await this.handleManager.mkdir(path)\n } catch (err) {\n this.logError('mkdir', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Remove a directory\n */\n async rmdir(path: string): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.rmdir(path)\n }\n\n this.log('rmdir', path)\n try {\n const normalizedPath = normalize(path)\n this.handleManager.clearCache(normalizedPath)\n\n if (isRoot(normalizedPath)) {\n const root = await this.handleManager.getRoot()\n const entries: string[] = []\n for await (const [name] of root.entries()) {\n entries.push(name)\n }\n await this.limitConcurrency(entries, 10, (name) =>\n root.removeEntry(name, { recursive: true })\n )\n // Reset all storage state since all files including metadata are gone\n this.symlinkManager.reset()\n this.packedStorage.reset()\n return\n }\n\n const pathSegments = segments(normalizedPath)\n const name = pathSegments.pop()!\n let dir = await this.handleManager.getRoot()\n\n for (const part of pathSegments) {\n dir = await dir.getDirectoryHandle(part)\n }\n\n try {\n await dir.removeEntry(name, { recursive: true })\n } catch {\n throw createENOENT(path)\n }\n } catch (err) {\n this.logError('rmdir', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Remove a file or symlink\n */\n async unlink(path: string): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.unlink(path)\n }\n\n this.log('unlink', path)\n try {\n const normalizedPath = normalize(path)\n this.handleManager.clearCache(normalizedPath)\n\n // Check if it's a symlink\n const isSymlink = await this.symlinkManager.isSymlink(normalizedPath)\n if (isSymlink) {\n await this.symlinkManager.unlink(normalizedPath)\n return\n }\n\n // Check if it's in packed storage\n const inPack = await this.packedStorage.has(normalizedPath)\n if (inPack) {\n await this.packedStorage.remove(normalizedPath)\n return\n }\n\n // Otherwise it's a regular file\n const { dir, name, fileHandle } = await this.handleManager.getHandle(normalizedPath)\n if (!fileHandle) throw createENOENT(path)\n\n try {\n await dir!.removeEntry(name!)\n } catch {\n throw createENOENT(path)\n }\n } catch (err) {\n this.logError('unlink', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Read directory contents\n */\n async readdir(path: string, options?: ReaddirOptions): Promise<string[] | Dirent[]> {\n if (this.hybrid) {\n return this.hybrid.readdir(path, options)\n }\n\n this.log('readdir', path, options)\n try {\n const normalizedPath = normalize(path)\n const resolvedPath = await this.symlinkManager.resolve(normalizedPath)\n\n const dir = await this.handleManager.getDirectoryHandle(resolvedPath)\n const withFileTypes = options?.withFileTypes === true\n\n // Pre-fetch symlinks only once - skip if no symlinks exist (common case)\n const symlinksInDir = await this.symlinkManager.getSymlinksInDir(resolvedPath)\n const hasSymlinks = symlinksInDir.length > 0\n const symlinkSet = hasSymlinks ? new Set(symlinksInDir) : null\n\n // Collect entries from OPFS directory\n const entryNames = new Set<string>()\n const entries: (string | Dirent)[] = []\n\n for await (const [name, handle] of dir.entries()) {\n if (this.symlinkManager.isMetadataFile(name)) continue\n\n entryNames.add(name)\n\n if (withFileTypes) {\n // Only check symlink if there are symlinks\n const isSymlink = hasSymlinks && symlinkSet!.has(name)\n entries.push({\n name,\n isFile: () => !isSymlink && handle.kind === 'file',\n isDirectory: () => !isSymlink && handle.kind === 'directory',\n isSymbolicLink: () => isSymlink\n })\n } else {\n entries.push(name)\n }\n }\n\n // Add symlinks that don't have corresponding OPFS entries (only if there are symlinks)\n if (hasSymlinks) {\n for (const name of symlinksInDir) {\n if (!entryNames.has(name)) {\n if (withFileTypes) {\n entries.push({\n name,\n isFile: () => false,\n isDirectory: () => false,\n isSymbolicLink: () => true\n })\n } else {\n entries.push(name)\n }\n }\n }\n }\n\n return entries as string[] | Dirent[]\n } catch (err) {\n this.logError('readdir', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Get file/directory statistics (follows symlinks)\n */\n async stat(path: string): Promise<Stats> {\n if (this.hybrid) {\n return this.hybrid.stat(path)\n }\n\n this.log('stat', path)\n try {\n const normalizedPath = normalize(path)\n const resolvedPath = await this.symlinkManager.resolve(normalizedPath)\n const defaultDate = new Date(0)\n\n if (isRoot(resolvedPath)) {\n return {\n type: 'dir',\n size: 0,\n mode: 0o040755,\n ctime: defaultDate,\n ctimeMs: 0,\n mtime: defaultDate,\n mtimeMs: 0,\n isFile: () => false,\n isDirectory: () => true,\n isSymbolicLink: () => false\n }\n }\n\n const pathSegments = segments(resolvedPath)\n const name = pathSegments.pop()!\n let dir = await this.handleManager.getRoot()\n\n for (const part of pathSegments) {\n try {\n dir = await dir.getDirectoryHandle(part)\n } catch {\n throw createENOENT(path)\n }\n }\n\n // Check both file and directory in parallel for best performance\n const [fileResult, dirResult] = await Promise.allSettled([\n dir.getFileHandle(name),\n dir.getDirectoryHandle(name)\n ])\n\n if (fileResult.status === 'fulfilled') {\n const fileHandle = fileResult.value\n const file = await fileHandle.getFile()\n const mtime = file.lastModified ? new Date(file.lastModified) : defaultDate\n\n return {\n type: 'file',\n size: file.size,\n mode: 0o100644,\n ctime: mtime,\n ctimeMs: mtime.getTime(),\n mtime,\n mtimeMs: mtime.getTime(),\n isFile: () => true,\n isDirectory: () => false,\n isSymbolicLink: () => false\n }\n }\n\n if (dirResult.status === 'fulfilled') {\n return {\n type: 'dir',\n size: 0,\n mode: 0o040755,\n ctime: defaultDate,\n ctimeMs: 0,\n mtime: defaultDate,\n mtimeMs: 0,\n isFile: () => false,\n isDirectory: () => true,\n isSymbolicLink: () => false\n }\n }\n\n // Check packed storage as fallback\n const packedSize = await this.packedStorage.getSize(resolvedPath)\n if (packedSize !== null) {\n return {\n type: 'file',\n size: packedSize,\n mode: 0o100644,\n ctime: defaultDate,\n ctimeMs: 0,\n mtime: defaultDate,\n mtimeMs: 0,\n isFile: () => true,\n isDirectory: () => false,\n isSymbolicLink: () => false\n }\n }\n\n throw createENOENT(path)\n } catch (err) {\n this.logError('stat', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Get file/directory statistics (does not follow symlinks)\n */\n async lstat(path: string): Promise<Stats> {\n if (this.hybrid) {\n return this.hybrid.lstat(path)\n }\n\n this.log('lstat', path)\n try {\n const normalizedPath = normalize(path)\n const isSymlink = await this.symlinkManager.isSymlink(normalizedPath)\n\n if (isSymlink) {\n const target = await this.symlinkManager.readlink(normalizedPath)\n return {\n type: 'symlink',\n target,\n size: target.length,\n mode: 0o120777,\n ctime: new Date(0),\n ctimeMs: 0,\n mtime: new Date(0),\n mtimeMs: 0,\n isFile: () => false,\n isDirectory: () => false,\n isSymbolicLink: () => true\n }\n }\n\n return this.stat(path)\n } catch (err) {\n this.logError('lstat', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Rename a file or directory\n */\n async rename(oldPath: string, newPath: string): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.rename(oldPath, newPath)\n }\n\n this.log('rename', oldPath, newPath)\n try {\n const normalizedOld = normalize(oldPath)\n const normalizedNew = normalize(newPath)\n\n this.handleManager.clearCache(normalizedOld)\n this.handleManager.clearCache(normalizedNew)\n\n // Handle symlink rename\n const renamed = await this.symlinkManager.rename(normalizedOld, normalizedNew)\n if (renamed) return\n\n const stat = await this.stat(normalizedOld)\n\n if (stat.isFile()) {\n // Run readFile and ensureParentDir in parallel (no dependency)\n const [data] = await Promise.all([\n this.readFile(normalizedOld),\n this.handleManager.ensureParentDir(normalizedNew)\n ])\n await this.writeFile(normalizedNew, data as Uint8Array)\n await this.unlink(normalizedOld)\n } else if (stat.isDirectory()) {\n await this.mkdir(normalizedNew)\n const entries = await this.readdir(normalizedOld) as string[]\n // Use concurrency limiter to avoid Promise overhead for small batches\n await this.limitConcurrency(entries, 10, entry =>\n this.rename(`${normalizedOld}/${entry}`, `${normalizedNew}/${entry}`)\n )\n await this.rmdir(normalizedOld)\n }\n } catch (err) {\n this.logError('rename', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Create a symbolic link\n */\n async symlink(target: string, path: string): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.symlink(target, path)\n }\n\n this.log('symlink', target, path)\n try {\n const normalizedPath = normalize(path)\n this.handleManager.clearCache(normalizedPath)\n\n // Fast existence check - just try to get handle, much faster than full stat()\n await this.symlinkManager.symlink(target, path, async () => {\n const { fileHandle, dirHandle } = await this.handleManager.getHandle(normalizedPath)\n if (fileHandle || dirHandle) {\n throw createEEXIST(path)\n }\n })\n } catch (err) {\n this.logError('symlink', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Read symlink target\n */\n async readlink(path: string): Promise<string> {\n if (this.hybrid) {\n return this.hybrid.readlink(path)\n }\n\n this.log('readlink', path)\n try {\n return await this.symlinkManager.readlink(path)\n } catch (err) {\n this.logError('readlink', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Create multiple symlinks efficiently\n */\n async symlinkBatch(links: SymlinkDefinition[]): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.symlinkBatch(links)\n }\n\n this.log('symlinkBatch', links.length, 'links')\n try {\n // Clear cache once at the start for all paths\n for (const { path } of links) {\n this.handleManager.clearCache(normalize(path))\n }\n\n // Fast existence check - if parent doesn't exist, symlink path is available\n await this.symlinkManager.symlinkBatch(links, async (normalizedPath) => {\n try {\n const { fileHandle, dirHandle } = await this.handleManager.getHandle(normalizedPath)\n if (fileHandle || dirHandle) {\n throw createEEXIST(normalizedPath)\n }\n } catch (err) {\n // If ENOENT (parent doesn't exist), the path is available for symlink\n if ((err as { code?: string }).code === 'ENOENT') return\n throw err\n }\n })\n } catch (err) {\n this.logError('symlinkBatch', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Check file accessibility\n */\n async access(path: string, mode = constants.F_OK): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.access(path, mode)\n }\n\n this.log('access', path, mode)\n try {\n const normalizedPath = normalize(path)\n await this.stat(normalizedPath)\n // OPFS doesn't have permissions, existence check is enough\n } catch (err) {\n this.logError('access', err)\n throw createEACCES(path)\n }\n }\n\n /**\n * Append data to a file\n */\n async appendFile(path: string, data: string | Uint8Array, options: WriteFileOptions = {}): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.appendFile(path, data, options)\n }\n\n this.log('appendFile', path)\n try {\n const normalizedPath = normalize(path)\n const resolvedPath = await this.symlinkManager.resolve(normalizedPath)\n\n let existingData: Uint8Array = new Uint8Array(0)\n try {\n const result = await this.readFile(resolvedPath)\n existingData = result instanceof Uint8Array ? result : new TextEncoder().encode(result)\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') throw err\n }\n\n const newData = typeof data === 'string'\n ? new TextEncoder().encode(data)\n : data\n\n const combined = new Uint8Array(existingData.length + newData.length)\n combined.set(existingData, 0)\n combined.set(newData, existingData.length)\n\n await this.writeFile(resolvedPath, combined, options)\n } catch (err) {\n this.logError('appendFile', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Copy a file\n */\n async copyFile(src: string, dest: string, mode = 0): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.copyFile(src, dest, mode)\n }\n\n this.log('copyFile', src, dest, mode)\n try {\n const normalizedSrc = normalize(src)\n const normalizedDest = normalize(dest)\n const resolvedSrc = await this.symlinkManager.resolve(normalizedSrc)\n\n // Check COPYFILE_EXCL flag\n if (mode & constants.COPYFILE_EXCL) {\n try {\n await this.stat(normalizedDest)\n throw createEEXIST(dest)\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') throw err\n }\n }\n\n // Run readFile and ensureParentDir in parallel (no dependency)\n const [data] = await Promise.all([\n this.readFile(resolvedSrc),\n this.handleManager.ensureParentDir(normalizedDest)\n ])\n await this.writeFile(normalizedDest, data as Uint8Array)\n } catch (err) {\n this.logError('copyFile', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Copy files/directories recursively\n */\n async cp(src: string, dest: string, options: CpOptions = {}): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.cp(src, dest, options)\n }\n\n this.log('cp', src, dest, options)\n try {\n const normalizedSrc = normalize(src)\n const normalizedDest = normalize(dest)\n const { recursive = false, force = false, errorOnExist = false } = options\n\n const srcStat = await this.stat(normalizedSrc)\n\n if (srcStat.isDirectory()) {\n if (!recursive) {\n throw createEISDIR(src)\n }\n\n let destExists = false\n try {\n await this.stat(normalizedDest)\n destExists = true\n if (errorOnExist && !force) {\n throw createEEXIST(dest)\n }\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') throw err\n }\n\n if (!destExists) {\n await this.mkdir(normalizedDest)\n }\n\n const entries = await this.readdir(normalizedSrc) as string[]\n // Use concurrency limiter to avoid Promise overhead for small batches\n await this.limitConcurrency(entries, 10, entry =>\n this.cp(`${normalizedSrc}/${entry}`, `${normalizedDest}/${entry}`, options)\n )\n } else {\n if (errorOnExist) {\n try {\n await this.stat(normalizedDest)\n throw createEEXIST(dest)\n } catch (err) {\n if ((err as { code?: string }).code !== 'ENOENT') throw err\n }\n }\n await this.copyFile(normalizedSrc, normalizedDest)\n }\n } catch (err) {\n this.logError('cp', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Check if path exists\n */\n async exists(path: string): Promise<boolean> {\n if (this.hybrid) {\n return this.hybrid.exists(path)\n }\n\n this.log('exists', path)\n try {\n await this.stat(normalize(path))\n return true\n } catch {\n return false\n }\n }\n\n /**\n * Resolve symlinks to get real path\n */\n async realpath(path: string): Promise<string> {\n if (this.hybrid) {\n return this.hybrid.realpath(path)\n }\n\n this.log('realpath', path)\n const normalizedPath = normalize(path)\n return this.symlinkManager.resolve(normalizedPath)\n }\n\n /**\n * Remove files and directories\n */\n async rm(path: string, options: RmOptions = {}): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.rm(path, options)\n }\n\n this.log('rm', path, options)\n try {\n const normalizedPath = normalize(path)\n const { recursive = false, force = false } = options\n\n try {\n const stat = await this.lstat(normalizedPath)\n\n if (stat.isSymbolicLink()) {\n await this.unlink(normalizedPath)\n } else if (stat.isDirectory()) {\n if (!recursive) {\n throw createEISDIR(path)\n }\n await this.rmdir(normalizedPath)\n } else {\n await this.unlink(normalizedPath)\n }\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT' && force) {\n return\n }\n throw err\n }\n } catch (err) {\n this.logError('rm', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Truncate file to specified length\n */\n async truncate(path: string, len = 0): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.truncate(path, len)\n }\n\n this.log('truncate', path, len)\n try {\n const normalizedPath = normalize(path)\n const resolvedPath = await this.symlinkManager.resolve(normalizedPath)\n this.handleManager.clearCache(resolvedPath)\n\n const { fileHandle } = await this.handleManager.getHandle(resolvedPath)\n if (!fileHandle) throw createENOENT(path)\n\n if (this.useSync) {\n const access = await fileHandle.createSyncAccessHandle()\n try {\n access.truncate(len)\n } finally {\n access.close()\n }\n } else {\n const file = await fileHandle.getFile()\n const data = new Uint8Array(await file.arrayBuffer())\n\n // Create a new array with the truncated/padded size\n const finalData = new Uint8Array(len)\n // Copy up to len bytes from original data using set() for performance\n const copyLen = Math.min(len, data.length)\n if (copyLen > 0) {\n finalData.set(data.subarray(0, copyLen), 0)\n }\n // Remaining bytes (if any) are already zero from Uint8Array initialization\n\n const writable = await fileHandle.createWritable()\n await writable.write(finalData)\n await writable.close()\n }\n } catch (err) {\n this.logError('truncate', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Create a unique temporary directory\n */\n async mkdtemp(prefix: string): Promise<string> {\n if (this.hybrid) {\n return this.hybrid.mkdtemp(prefix)\n }\n\n this.log('mkdtemp', prefix)\n try {\n const normalizedPrefix = normalize(prefix)\n const suffix = `${Date.now()}-${++this.tmpCounter}-${Math.random().toString(36).slice(2, 8)}`\n const path = `${normalizedPrefix}${suffix}`\n await this.mkdir(path)\n return path\n } catch (err) {\n this.logError('mkdtemp', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Change file mode (no-op for OPFS compatibility)\n */\n async chmod(path: string, mode: number): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.chmod(path, mode)\n }\n\n this.log('chmod', path, mode)\n await this.stat(normalize(path))\n // OPFS doesn't support file modes\n }\n\n /**\n * Change file owner (no-op for OPFS compatibility)\n */\n async chown(path: string, uid: number, gid: number): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.chown(path, uid, gid)\n }\n\n this.log('chown', path, uid, gid)\n await this.stat(normalize(path))\n // OPFS doesn't support file ownership\n }\n\n /**\n * Update file timestamps (no-op for OPFS compatibility)\n */\n async utimes(path: string, atime: Date | number, mtime: Date | number): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.utimes(path, atime, mtime)\n }\n\n this.log('utimes', path, atime, mtime)\n await this.stat(normalize(path))\n // OPFS doesn't support setting timestamps\n }\n\n /**\n * Update symlink timestamps (no-op)\n */\n async lutimes(path: string, atime: Date | number, mtime: Date | number): Promise<void> {\n if (this.hybrid) {\n return this.hybrid.lutimes(path, atime, mtime)\n }\n\n this.log('lutimes', path, atime, mtime)\n await this.lstat(normalize(path))\n // OPFS doesn't support setting timestamps\n }\n\n /**\n * Open file and return FileHandle\n */\n async open(path: string, flags: string | number = 'r', mode = 0o666): Promise<FileHandle> {\n this.log('open', path, flags, mode)\n try {\n const normalizedPath = normalize(path)\n const flagStr = flagsToString(flags)\n const shouldCreate = flagStr.includes('w') || flagStr.includes('a') || flagStr.includes('+')\n const shouldTruncate = flagStr.includes('w')\n const shouldAppend = flagStr.includes('a')\n\n if (shouldCreate) {\n await this.handleManager.ensureParentDir(normalizedPath)\n }\n\n const resolvedPath = await this.symlinkManager.resolve(normalizedPath)\n const { fileHandle } = await this.handleManager.getHandle(resolvedPath, { create: shouldCreate })\n\n if (!fileHandle && !shouldCreate) {\n throw createENOENT(path)\n }\n\n if (shouldTruncate && fileHandle) {\n await this.truncate(resolvedPath, 0)\n }\n\n const initialPosition = shouldAppend ? (await this.stat(resolvedPath)).size : 0\n\n return createFileHandle(resolvedPath, initialPosition, {\n readFile: (p, o) => this.readFile(p, o),\n writeFile: (p, d) => this.writeFile(p, d),\n stat: (p) => this.stat(p),\n truncate: (p, l) => this.truncate(p, l),\n appendFile: (p, d, o) => this.appendFile(p, d, o)\n })\n } catch (err) {\n this.logError('open', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Open directory for iteration\n */\n async opendir(path: string): Promise<Dir> {\n this.log('opendir', path)\n try {\n const normalizedPath = normalize(path)\n const entries = await this.readdir(normalizedPath, { withFileTypes: true }) as Dirent[]\n let index = 0\n\n return {\n path: normalizedPath,\n\n async read(): Promise<Dirent | null> {\n if (index >= entries.length) return null\n return entries[index++]\n },\n\n async close(): Promise<void> {\n index = entries.length\n },\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Dirent> {\n for (const entry of entries) {\n yield entry\n }\n }\n }\n } catch (err) {\n this.logError('opendir', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Watch for file changes\n */\n watch(path: string, options: WatchOptions = {}): FSWatcher {\n this.log('watch', path, options)\n const normalizedPath = normalize(path)\n const { recursive = false, signal } = options\n\n const callbacks = new Set<WatchCallback>()\n const id = Symbol('watcher')\n\n this.watchCallbacks.set(id, { path: normalizedPath, callbacks, recursive })\n\n if (signal) {\n signal.addEventListener('abort', () => {\n this.watchCallbacks.delete(id)\n })\n }\n\n const self = this\n\n return {\n close(): void {\n self.watchCallbacks.delete(id)\n },\n\n ref(): FSWatcher {\n return this\n },\n\n unref(): FSWatcher {\n return this\n },\n\n [Symbol.asyncIterator](): AsyncIterator<{ eventType: 'rename' | 'change'; filename: string }> {\n const queue: { eventType: 'rename' | 'change'; filename: string }[] = []\n let resolver: ((value: IteratorResult<{ eventType: 'rename' | 'change'; filename: string }>) => void) | null = null\n\n callbacks.add((eventType, filename) => {\n const event = { eventType: eventType as 'rename' | 'change', filename }\n if (resolver) {\n resolver({ value: event, done: false })\n resolver = null\n } else {\n queue.push(event)\n }\n })\n\n return {\n next(): Promise<IteratorResult<{ eventType: 'rename' | 'change'; filename: string }>> {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false })\n }\n return new Promise(resolve => {\n resolver = resolve\n })\n },\n return(): Promise<IteratorResult<{ eventType: 'rename' | 'change'; filename: string }>> {\n return Promise.resolve({ done: true, value: undefined })\n }\n }\n }\n }\n }\n\n /**\n * Create read stream\n */\n createReadStream(path: string, options: ReadStreamOptions = {}): ReadableStream<Uint8Array> {\n this.log('createReadStream', path, options)\n const normalizedPath = normalize(path)\n return createReadStream(normalizedPath, options, {\n readFile: (p) => this.readFile(p) as Promise<Uint8Array>\n })\n }\n\n /**\n * Create write stream\n */\n createWriteStream(path: string, options: WriteStreamOptions = {}): WritableStream<Uint8Array> {\n this.log('createWriteStream', path, options)\n const normalizedPath = normalize(path)\n return createWriteStream(normalizedPath, options, {\n readFile: (p) => this.readFile(p) as Promise<Uint8Array>,\n writeFile: (p, d) => this.writeFile(p, d)\n })\n }\n\n /**\n * Get file statistics (alias for stat)\n */\n async backFile(path: string): Promise<Stats> {\n this.log('backFile', path)\n try {\n return await this.stat(normalize(path))\n } catch (err) {\n if ((err as { code?: string }).code === 'ENOENT') throw err\n throw createENOENT(path)\n }\n }\n\n /**\n * Get disk usage for a path\n */\n async du(path: string): Promise<DiskUsage> {\n if (this.hybrid) {\n return this.hybrid.du(path)\n }\n\n this.log('du', path)\n const normalizedPath = normalize(path)\n const stat = await this.stat(normalizedPath)\n return { path: normalizedPath, size: stat.size }\n }\n\n /**\n * Get filesystem statistics (similar to Node.js fs.statfs)\n * Uses the Storage API to get quota and usage information\n * Note: Values are estimates for the entire origin, not per-path\n */\n async statfs(path?: string): Promise<StatFs> {\n if (this.hybrid) {\n return this.hybrid.statfs(path)\n }\n\n this.log('statfs', path)\n try {\n // Verify path exists if provided\n if (path) {\n await this.stat(normalize(path))\n }\n\n if (typeof navigator === 'undefined' || !navigator.storage?.estimate) {\n throw new Error('Storage API not available')\n }\n\n const estimate = await navigator.storage.estimate()\n const usage = estimate.usage ?? 0\n const quota = estimate.quota ?? 0\n const bsize = 4096 // Simulated block size\n\n return {\n type: 0,\n bsize,\n blocks: Math.floor(quota / bsize),\n bfree: Math.floor((quota - usage) / bsize),\n bavail: Math.floor((quota - usage) / bsize),\n files: 0,\n ffree: 0,\n usage,\n quota\n }\n } catch (err) {\n this.logError('statfs', err)\n throw wrapError(err)\n }\n }\n\n /**\n * Reset internal caches\n * Useful when external processes modify the filesystem\n */\n resetCache(): void {\n if (this.hybrid) {\n // For hybrid, this is async but we provide a sync interface for compatibility\n // Use gc() for guaranteed cleanup\n this.hybrid.resetCache()\n return\n }\n\n this.symlinkManager.reset()\n this.packedStorage.reset()\n this.handleManager.clearCache()\n }\n\n /**\n * Force full garbage collection\n * Releases all handles and caches, reinitializes the worker in hybrid mode\n * Use this for long-running operations to prevent memory leaks\n */\n async gc(): Promise<void> {\n if (this.hybrid) {\n await this.hybrid.gc()\n return\n }\n\n this.symlinkManager.reset()\n await this.packedStorage.clear()\n this.handleManager.clearCache()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/path.ts","../src/constants.ts","../src/errors.ts","../src/filesystem.ts","../src/index.ts"],"names":["isAbsolute","resolve","result","self"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"index.js","sourcesContent":["/**\n * POSIX-style path utilities for OPFS\n * Mirrors Node.js path module behavior\n */\n\nexport const sep = '/';\nexport const delimiter = ':';\n\nexport function normalize(p: string): string {\n if (p.length === 0) return '.';\n\n const isAbsolute = p.charCodeAt(0) === 47; // '/'\n const trailingSlash = p.charCodeAt(p.length - 1) === 47;\n\n const segments = p.split('/');\n const result: string[] = [];\n\n for (const segment of segments) {\n if (segment === '' || segment === '.') {\n continue;\n }\n if (segment === '..') {\n if (result.length > 0 && result[result.length - 1] !== '..') {\n result.pop();\n } else if (!isAbsolute) {\n result.push('..');\n }\n } else {\n result.push(segment);\n }\n }\n\n let normalized = result.join('/');\n\n if (isAbsolute) {\n normalized = '/' + normalized;\n }\n\n if (trailingSlash && normalized.length > 1) {\n normalized += '/';\n }\n\n return normalized || (isAbsolute ? '/' : '.');\n}\n\nexport function join(...paths: string[]): string {\n if (paths.length === 0) return '.';\n\n let joined: string | undefined;\n\n for (const path of paths) {\n if (path.length > 0) {\n if (joined === undefined) {\n joined = path;\n } else {\n joined += '/' + path;\n }\n }\n }\n\n if (joined === undefined) return '.';\n\n return normalize(joined);\n}\n\nexport function resolve(...paths: string[]): string {\n let resolvedPath = '';\n let resolvedAbsolute = false;\n\n for (let i = paths.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n const path = i >= 0 ? paths[i] : '/';\n\n // Handle undefined, null, or empty paths\n if (path == null || path.length === 0) continue;\n\n resolvedPath = resolvedPath ? path + '/' + resolvedPath : path;\n resolvedAbsolute = path.charCodeAt(0) === 47; // '/'\n }\n\n resolvedPath = normalize(resolvedPath);\n\n // Remove trailing slash unless it's the root\n if (resolvedPath.length > 1 && resolvedPath.endsWith('/')) {\n resolvedPath = resolvedPath.slice(0, -1);\n }\n\n if (resolvedAbsolute) {\n return resolvedPath.length > 0 ? resolvedPath : '/';\n }\n\n return resolvedPath.length > 0 ? resolvedPath : '.';\n}\n\nexport function isAbsolute(p: string): boolean {\n return p.length > 0 && p.charCodeAt(0) === 47; // '/'\n}\n\nexport function dirname(p: string): string {\n if (p.length === 0) return '.';\n\n const hasRoot = p.charCodeAt(0) === 47;\n let end = -1;\n let matchedSlash = true;\n\n for (let i = p.length - 1; i >= 1; --i) {\n if (p.charCodeAt(i) === 47) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n\n return p.slice(0, end);\n}\n\nexport function basename(p: string, ext?: string): string {\n let start = 0;\n let end = -1;\n let matchedSlash = true;\n\n for (let i = p.length - 1; i >= 0; --i) {\n if (p.charCodeAt(i) === 47) {\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n\n const base = p.slice(start, end);\n\n if (ext && base.endsWith(ext)) {\n return base.slice(0, base.length - ext.length);\n }\n\n return base;\n}\n\nexport function extname(p: string): string {\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let preDotState = 0;\n\n for (let i = p.length - 1; i >= 0; --i) {\n const code = p.charCodeAt(i);\n\n if (code === 47) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n\n if (code === 46) {\n if (startDot === -1) {\n startDot = i;\n } else if (preDotState !== 1) {\n preDotState = 1;\n }\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n\n if (\n startDot === -1 ||\n end === -1 ||\n preDotState === 0 ||\n (preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)\n ) {\n return '';\n }\n\n return p.slice(startDot, end);\n}\n\nexport function relative(from: string, to: string): string {\n if (from === to) return '';\n\n from = resolve(from);\n to = resolve(to);\n\n if (from === to) return '';\n\n // Split into segments\n const fromParts = from.split('/').filter(Boolean);\n const toParts = to.split('/').filter(Boolean);\n\n // Find common base\n let commonLength = 0;\n const minLength = Math.min(fromParts.length, toParts.length);\n for (let i = 0; i < minLength; i++) {\n if (fromParts[i] === toParts[i]) {\n commonLength++;\n } else {\n break;\n }\n }\n\n // Build relative path\n const upCount = fromParts.length - commonLength;\n const relativeParts: string[] = [];\n\n for (let i = 0; i < upCount; i++) {\n relativeParts.push('..');\n }\n\n for (let i = commonLength; i < toParts.length; i++) {\n relativeParts.push(toParts[i]);\n }\n\n return relativeParts.join('/') || '.';\n}\n\nexport function parse(p: string): {\n root: string;\n dir: string;\n base: string;\n ext: string;\n name: string;\n} {\n const ret = { root: '', dir: '', base: '', ext: '', name: '' };\n\n if (p.length === 0) return ret;\n\n const isAbsolutePath = p.charCodeAt(0) === 47;\n\n if (isAbsolutePath) {\n ret.root = '/';\n }\n\n let start = 0;\n let end = -1;\n let startDot = -1;\n let matchedSlash = true;\n let preDotState = 0;\n\n for (let i = p.length - 1; i >= 0; --i) {\n const code = p.charCodeAt(i);\n\n if (code === 47) {\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n continue;\n }\n\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n\n if (code === 46) {\n if (startDot === -1) {\n startDot = i;\n } else if (preDotState !== 1) {\n preDotState = 1;\n }\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n\n if (end !== -1) {\n if (\n startDot === -1 ||\n preDotState === 0 ||\n (preDotState === 1 && startDot === end - 1 && startDot === start + 1)\n ) {\n ret.base = p.slice(start, end);\n ret.name = ret.base;\n } else {\n ret.name = p.slice(start, startDot);\n ret.base = p.slice(start, end);\n ret.ext = p.slice(startDot, end);\n }\n }\n\n if (start > 0) {\n ret.dir = p.slice(0, start - 1);\n } else if (isAbsolutePath) {\n ret.dir = '/';\n }\n\n return ret;\n}\n\nexport function format(pathObject: {\n root?: string;\n dir?: string;\n base?: string;\n ext?: string;\n name?: string;\n}): string {\n const dir = pathObject.dir || pathObject.root || '';\n const base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n\n if (!dir) return base;\n if (dir === pathObject.root) return dir + base;\n\n return dir + '/' + base;\n}\n\nexport const posix = {\n sep,\n delimiter,\n normalize,\n join,\n resolve,\n isAbsolute,\n dirname,\n basename,\n extname,\n relative,\n parse,\n format,\n};\n\nexport default posix;\n","/**\n * File system constants matching Node.js fs.constants\n */\n\nexport const constants = {\n // File access constants\n F_OK: 0,\n R_OK: 4,\n W_OK: 2,\n X_OK: 1,\n\n // File copy constants\n COPYFILE_EXCL: 1,\n COPYFILE_FICLONE: 2,\n COPYFILE_FICLONE_FORCE: 4,\n\n // File open constants\n O_RDONLY: 0,\n O_WRONLY: 1,\n O_RDWR: 2,\n O_CREAT: 64,\n O_EXCL: 128,\n O_TRUNC: 512,\n O_APPEND: 1024,\n O_SYNC: 4096,\n\n // File type constants\n S_IFMT: 61440,\n S_IFREG: 32768,\n S_IFDIR: 16384,\n S_IFCHR: 8192,\n S_IFBLK: 24576,\n S_IFIFO: 4096,\n S_IFLNK: 40960,\n S_IFSOCK: 49152,\n\n // File mode constants\n S_IRWXU: 448,\n S_IRUSR: 256,\n S_IWUSR: 128,\n S_IXUSR: 64,\n S_IRWXG: 56,\n S_IRGRP: 32,\n S_IWGRP: 16,\n S_IXGRP: 8,\n S_IRWXO: 7,\n S_IROTH: 4,\n S_IWOTH: 2,\n S_IXOTH: 1,\n} as const;\n\nexport type Constants = typeof constants;\n","/**\n * Node.js compatible filesystem error classes\n */\n\nexport class FSError extends Error {\n code: string;\n errno: number;\n syscall?: string;\n path?: string;\n\n constructor(code: string, errno: number, message: string, syscall?: string, path?: string) {\n super(message);\n this.name = 'FSError';\n this.code = code;\n this.errno = errno;\n this.syscall = syscall;\n this.path = path;\n\n // Maintain proper stack trace (V8 specific)\n const ErrorWithCapture = Error as unknown as { captureStackTrace?: (target: object, constructor: Function) => void };\n if (ErrorWithCapture.captureStackTrace) {\n ErrorWithCapture.captureStackTrace(this, FSError);\n }\n }\n}\n\nexport const ErrorCodes = {\n ENOENT: -2,\n EEXIST: -17,\n EISDIR: -21,\n ENOTDIR: -20,\n ENOTEMPTY: -39,\n EACCES: -13,\n EBADF: -9,\n EINVAL: -22,\n EMFILE: -24,\n ENOSPC: -28,\n EPERM: -1,\n ENOSYS: -38,\n ELOOP: -40,\n} as const;\n\nexport function createENOENT(syscall: string, path: string): FSError {\n return new FSError(\n 'ENOENT',\n ErrorCodes.ENOENT,\n `ENOENT: no such file or directory, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function createEEXIST(syscall: string, path: string): FSError {\n return new FSError(\n 'EEXIST',\n ErrorCodes.EEXIST,\n `EEXIST: file already exists, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function createEISDIR(syscall: string, path: string): FSError {\n return new FSError(\n 'EISDIR',\n ErrorCodes.EISDIR,\n `EISDIR: illegal operation on a directory, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function createENOTDIR(syscall: string, path: string): FSError {\n return new FSError(\n 'ENOTDIR',\n ErrorCodes.ENOTDIR,\n `ENOTDIR: not a directory, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): FSError {\n return new FSError(\n 'ENOTEMPTY',\n ErrorCodes.ENOTEMPTY,\n `ENOTEMPTY: directory not empty, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function createEACCES(syscall: string, path: string): FSError {\n return new FSError(\n 'EACCES',\n ErrorCodes.EACCES,\n `EACCES: permission denied, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function createEINVAL(syscall: string, path: string): FSError {\n return new FSError(\n 'EINVAL',\n ErrorCodes.EINVAL,\n `EINVAL: invalid argument, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function createENOSYS(syscall: string, path: string): FSError {\n return new FSError(\n 'ENOSYS',\n ErrorCodes.ENOSYS,\n `ENOSYS: function not implemented, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function createELOOP(syscall: string, path: string): FSError {\n return new FSError(\n 'ELOOP',\n ErrorCodes.ELOOP,\n `ELOOP: too many symbolic links encountered, ${syscall} '${path}'`,\n syscall,\n path\n );\n}\n\nexport function mapErrorCode(errorName: string, syscall: string, path: string): FSError {\n switch (errorName) {\n case 'NotFoundError':\n return createENOENT(syscall, path);\n case 'NotAllowedError':\n return createEACCES(syscall, path);\n case 'TypeMismatchError':\n return createENOTDIR(syscall, path);\n case 'InvalidModificationError':\n return createENOTEMPTY(syscall, path);\n case 'QuotaExceededError':\n return new FSError('ENOSPC', ErrorCodes.ENOSPC, `ENOSPC: no space left on device, ${syscall} '${path}'`, syscall, path);\n default:\n return new FSError('EINVAL', ErrorCodes.EINVAL, `${errorName}: ${syscall} '${path}'`, syscall, path);\n }\n}\n","/**\n * OPFS FileSystem - Node.js fs-compatible API\n * Supports two performance tiers:\n * - Tier 1 (Sync): SharedArrayBuffer + Atomics - requires crossOriginIsolated (COOP/COEP headers)\n * - Tier 2 (Async): Promises API using Worker kernel - always available\n */\n\nimport * as path from './path.js';\nimport { constants } from './constants.js';\nimport {\n FSError,\n createENOENT,\n mapErrorCode,\n} from './errors.js';\nimport type {\n Stats,\n Dirent,\n ReadOptions,\n WriteOptions,\n MkdirOptions,\n RmdirOptions,\n RmOptions,\n ReaddirOptions,\n Encoding,\n FileSystemPromises,\n KernelResponse,\n KernelResult,\n ReadStreamOptions,\n WriteStreamOptions,\n WatchOptions,\n WatchFileOptions,\n WatchEventType,\n FileHandle,\n Dir,\n FSWatcher,\n StatWatcher,\n WatchListener,\n WatchFileListener,\n FileSystemChangeRecord,\n FileSystemObserverCallback,\n FileSystemObserverInterface,\n} from './types.js';\n\n// Detect if we're running in a Worker context (where Atomics.wait and createSyncAccessHandle work)\nconst isWorkerContext = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\n\n// Worker kernel source - inlined for zero-config deployment\n// Uses direct Worker postMessage for simple communication\n// Includes sync handle caching for performance (same as sync kernel)\nconst KERNEL_SOURCE = `\nconst LOCK_NAME = 'opfs_fs_lock';\nlet messageQueue = [];\nlet isReady = false;\nlet cachedRoot = null;\nconst dirCache = new Map();\n\n// Sync handle cache - MAJOR performance optimization\nconst syncHandleCache = new Map();\nconst MAX_HANDLES = 100;\n\nasync function getSyncHandle(filePath, create) {\n const cached = syncHandleCache.get(filePath);\n if (cached) return cached;\n\n // Evict oldest handles if cache is full\n if (syncHandleCache.size >= MAX_HANDLES) {\n const keys = Array.from(syncHandleCache.keys()).slice(0, 10);\n for (const key of keys) {\n const h = syncHandleCache.get(key);\n if (h) { try { h.close(); } catch {} syncHandleCache.delete(key); }\n }\n }\n\n const fh = await getFileHandle(filePath, create);\n const access = await fh.createSyncAccessHandle();\n syncHandleCache.set(filePath, access);\n return access;\n}\n\nfunction closeSyncHandle(filePath) {\n const h = syncHandleCache.get(filePath);\n if (h) { try { h.close(); } catch {} syncHandleCache.delete(filePath); }\n}\n\nfunction closeHandlesUnder(prefix) {\n for (const [p, h] of syncHandleCache) {\n if (p === prefix || p.startsWith(prefix + '/')) {\n try { h.close(); } catch {}\n syncHandleCache.delete(p);\n }\n }\n}\n\n// Clear directory cache entries for a path and all descendants\nfunction clearDirCacheUnder(filePath) {\n // Convert to cache key format (no leading slash)\n const prefix = parsePath(filePath).join('/');\n if (!prefix) {\n // Root directory - clear everything\n dirCache.clear();\n return;\n }\n for (const key of dirCache.keys()) {\n if (key === prefix || key.startsWith(prefix + '/')) {\n dirCache.delete(key);\n }\n }\n}\n\nasync function getRoot() {\n if (!cachedRoot) {\n cachedRoot = await navigator.storage.getDirectory();\n }\n return cachedRoot;\n}\n\nfunction parsePath(filePath) {\n return filePath.split('/').filter(Boolean);\n}\n\nasync function getDirectoryHandle(parts, create = false) {\n if (parts.length === 0) return getRoot();\n\n const cacheKey = parts.join('/');\n if (dirCache.has(cacheKey)) {\n return dirCache.get(cacheKey);\n }\n\n let curr = await getRoot();\n let pathSoFar = '';\n\n for (const part of parts) {\n pathSoFar += (pathSoFar ? '/' : '') + part;\n\n if (dirCache.has(pathSoFar)) {\n curr = dirCache.get(pathSoFar);\n } else {\n curr = await curr.getDirectoryHandle(part, { create });\n dirCache.set(pathSoFar, curr);\n }\n }\n\n return curr;\n}\n\nasync function getFileHandle(filePath, create = false) {\n const parts = parsePath(filePath);\n const fileName = parts.pop();\n if (!fileName) throw new Error('Invalid file path');\n const dir = parts.length > 0 ? await getDirectoryHandle(parts, create) : await getRoot();\n return await dir.getFileHandle(fileName, { create });\n}\n\nasync function getParentAndName(filePath) {\n const parts = parsePath(filePath);\n const name = parts.pop();\n if (!name) throw new Error('Invalid path');\n const parent = parts.length > 0 ? await getDirectoryHandle(parts, false) : await getRoot();\n return { parent, name };\n}\n\nasync function handleRead(filePath, payload) {\n const access = await getSyncHandle(filePath, false);\n const size = access.getSize();\n const offset = payload?.offset || 0;\n const len = payload?.len || (size - offset);\n const buf = new Uint8Array(len);\n const bytesRead = access.read(buf, { at: offset });\n return { data: buf.slice(0, bytesRead) };\n}\n\nasync function handleWrite(filePath, payload) {\n const access = await getSyncHandle(filePath, true);\n if (payload?.data) {\n const offset = payload.offset ?? 0;\n if (offset === 0) access.truncate(0);\n access.write(payload.data, { at: offset });\n // Only flush if explicitly requested (default: true for safety)\n if (payload?.flush !== false) access.flush();\n }\n return { success: true };\n}\n\nasync function handleAppend(filePath, payload) {\n const access = await getSyncHandle(filePath, true);\n if (payload?.data) {\n const size = access.getSize();\n access.write(payload.data, { at: size });\n if (payload?.flush !== false) access.flush();\n }\n return { success: true };\n}\n\nasync function handleTruncate(filePath, payload) {\n const access = await getSyncHandle(filePath, false);\n access.truncate(payload?.len ?? 0);\n access.flush();\n return { success: true };\n}\n\nasync function handleStat(filePath) {\n const parts = parsePath(filePath);\n // Node.js compatible stat shape: mode 33188 = file (0o100644), 16877 = dir (0o40755)\n if (parts.length === 0) {\n return { size: 0, mtimeMs: Date.now(), mode: 16877, type: 'directory' };\n }\n const name = parts.pop();\n const parent = parts.length > 0 ? await getDirectoryHandle(parts, false) : await getRoot();\n try {\n const fh = await parent.getFileHandle(name);\n // Use getFile() for metadata - faster than createSyncAccessHandle\n const file = await fh.getFile();\n return { size: file.size, mtimeMs: file.lastModified, mode: 33188, type: 'file' };\n } catch {\n try {\n await parent.getDirectoryHandle(name);\n return { size: 0, mtimeMs: Date.now(), mode: 16877, type: 'directory' };\n } catch {\n throw new Error('NotFoundError');\n }\n }\n}\n\nasync function handleExists(filePath) {\n try {\n await handleStat(filePath);\n return { exists: true };\n } catch {\n return { exists: false };\n }\n}\n\nasync function handleMkdir(filePath, payload) {\n const parts = parsePath(filePath);\n if (payload?.recursive) {\n let curr = await getRoot();\n for (const part of parts) {\n curr = await curr.getDirectoryHandle(part, { create: true });\n }\n } else {\n const name = parts.pop();\n if (!name) throw new Error('Invalid path');\n const parent = parts.length > 0 ? await getDirectoryHandle(parts, false) : await getRoot();\n await parent.getDirectoryHandle(name, { create: true });\n }\n return { success: true };\n}\n\nasync function handleRmdir(filePath, payload) {\n closeHandlesUnder(filePath); // Close all cached file handles under this directory\n clearDirCacheUnder(filePath); // Clear stale directory cache entries\n const { parent, name } = await getParentAndName(filePath);\n if (payload?.recursive) {\n await parent.removeEntry(name, { recursive: true });\n } else {\n const dir = await parent.getDirectoryHandle(name);\n const entries = dir.entries();\n const first = await entries.next();\n if (!first.done) {\n const e = new Error('InvalidModificationError');\n e.name = 'InvalidModificationError';\n throw e;\n }\n await parent.removeEntry(name);\n }\n return { success: true };\n}\n\nasync function handleUnlink(filePath) {\n closeSyncHandle(filePath); // Close cached handle before deleting\n const { parent, name } = await getParentAndName(filePath);\n await parent.removeEntry(name);\n return { success: true };\n}\n\nasync function handleReaddir(filePath) {\n const parts = parsePath(filePath);\n const dir = parts.length > 0 ? await getDirectoryHandle(parts, false) : await getRoot();\n const entries = [];\n for await (const [name] of dir.entries()) {\n entries.push(name);\n }\n return { entries };\n}\n\nasync function handleRename(oldPath, payload) {\n if (!payload?.newPath) throw new Error('newPath required');\n const newPath = payload.newPath;\n\n // Close cached handles for old path (file will be deleted)\n closeSyncHandle(oldPath);\n closeHandlesUnder(oldPath); // For directory renames\n clearDirCacheUnder(oldPath); // Clear stale directory cache entries\n\n const oldParts = parsePath(oldPath);\n const newParts = parsePath(newPath);\n const oldName = oldParts.pop();\n const newName = newParts.pop();\n const oldParent = oldParts.length > 0 ? await getDirectoryHandle(oldParts, false) : await getRoot();\n const newParent = newParts.length > 0 ? await getDirectoryHandle(newParts, true) : await getRoot();\n\n try {\n const fh = await oldParent.getFileHandle(oldName);\n const file = await fh.getFile();\n const data = new Uint8Array(await file.arrayBuffer());\n\n // Use cached handle for new file\n const access = await getSyncHandle(newPath, true);\n access.truncate(0);\n access.write(data, { at: 0 });\n access.flush();\n\n await oldParent.removeEntry(oldName);\n return { success: true };\n } catch {\n const oldDir = await oldParent.getDirectoryHandle(oldName);\n async function copyDir(src, dst, dstPath) {\n for await (const [name, handle] of src.entries()) {\n if (handle.kind === 'file') {\n const srcFile = await handle.getFile();\n const data = new Uint8Array(await srcFile.arrayBuffer());\n const filePath = dstPath + '/' + name;\n const access = await getSyncHandle(filePath, true);\n access.truncate(0);\n access.write(data, { at: 0 });\n access.flush();\n } else {\n const newSubDir = await dst.getDirectoryHandle(name, { create: true });\n await copyDir(handle, newSubDir, dstPath + '/' + name);\n }\n }\n }\n const newDir = await newParent.getDirectoryHandle(newName, { create: true });\n await copyDir(oldDir, newDir, newPath);\n await oldParent.removeEntry(oldName, { recursive: true });\n return { success: true };\n }\n}\n\nasync function handleCopy(srcPath, payload) {\n if (!payload?.newPath) throw new Error('newPath required');\n const dstPath = payload.newPath;\n const srcParts = parsePath(srcPath);\n const srcName = srcParts.pop();\n const srcParent = srcParts.length > 0 ? await getDirectoryHandle(srcParts, false) : await getRoot();\n const srcFh = await srcParent.getFileHandle(srcName);\n const srcFile = await srcFh.getFile();\n const data = new Uint8Array(await srcFile.arrayBuffer());\n\n // Use cached handle for destination\n const access = await getSyncHandle(dstPath, true);\n access.truncate(0);\n access.write(data, { at: 0 });\n access.flush();\n return { success: true };\n}\n\nfunction handleFlush() {\n // Flush all cached sync handles\n for (const [, handle] of syncHandleCache) {\n try { handle.flush(); } catch {}\n }\n return { success: true };\n}\n\nfunction handlePurge() {\n // Flush and close all cached sync handles\n for (const [, handle] of syncHandleCache) {\n try { handle.flush(); handle.close(); } catch {}\n }\n syncHandleCache.clear();\n dirCache.clear();\n cachedRoot = null;\n return { success: true };\n}\n\nasync function processMessage(msg) {\n const { type, path, payload } = msg;\n switch (type) {\n case 'read': return handleRead(path, payload);\n case 'write': return handleWrite(path, payload);\n case 'append': return handleAppend(path, payload);\n case 'truncate': return handleTruncate(path, payload);\n case 'stat': return handleStat(path);\n case 'exists': return handleExists(path);\n case 'mkdir': return handleMkdir(path, payload);\n case 'rmdir': return handleRmdir(path, payload);\n case 'unlink': return handleUnlink(path);\n case 'readdir': return handleReaddir(path);\n case 'rename': return handleRename(path, payload);\n case 'copy': return handleCopy(path, payload);\n case 'flush': return handleFlush();\n case 'purge': return handlePurge();\n default: throw new Error('Unknown operation: ' + type);\n }\n}\n\nfunction sendAtomicsResponse(result, payload) {\n const ctrl = payload.ctrl;\n if (result.data && payload.dataBuffer) {\n const view = new Uint8Array(payload.dataBuffer);\n view.set(result.data);\n Atomics.store(ctrl, 0, result.data.length);\n } else if (result.entries && payload.resultBuffer) {\n const json = JSON.stringify(result);\n const encoded = new TextEncoder().encode(json);\n const view = new Uint8Array(payload.resultBuffer);\n view.set(encoded);\n Atomics.store(ctrl, 0, encoded.length);\n } else if (result.success) {\n Atomics.store(ctrl, 0, 1);\n } else if (result.exists !== undefined) {\n Atomics.store(ctrl, 0, result.exists ? 1 : 0);\n } else if (result.isFile !== undefined) {\n if (payload.resultBuffer) {\n const json = JSON.stringify(result);\n const encoded = new TextEncoder().encode(json);\n const view = new Uint8Array(payload.resultBuffer);\n view.set(encoded);\n Atomics.store(ctrl, 0, encoded.length);\n } else {\n Atomics.store(ctrl, 0, result.size || 0);\n }\n }\n Atomics.notify(ctrl, 0);\n}\n\n// Handle incoming messages\nasync function handleMessage(msg) {\n const { id, payload } = msg;\n try {\n const result = await processMessage(msg);\n if (payload?.ctrl) {\n sendAtomicsResponse(result, payload);\n } else {\n // Use Transferable for data to avoid copying\n if (result.data) {\n const buffer = result.data.buffer;\n self.postMessage({ id, result }, [buffer]);\n } else {\n self.postMessage({ id, result });\n }\n }\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n // Use error name if it's a specific DOM exception, otherwise use message\n // (handleStat throws new Error('NotFoundError') where message contains the type)\n const errorName = error.name || 'Error';\n const errorCode = errorName !== 'Error' ? errorName : (error.message || 'Error');\n if (payload?.ctrl) {\n Atomics.store(payload.ctrl, 0, -1);\n Atomics.notify(payload.ctrl, 0);\n } else {\n self.postMessage({ id, error: errorCode, code: errorCode });\n }\n }\n}\n\n// Process queued messages after ready\nfunction processQueue() {\n while (messageQueue.length > 0) {\n const msg = messageQueue.shift();\n handleMessage(msg);\n }\n}\n\n// Handle messages directly - no serialization needed because:\n// - Tier 2: Client awaits response before sending next message\n// - Each OPFSFileSystem instance has its own worker\nself.onmessage = (event) => {\n if (isReady) {\n handleMessage(event.data);\n } else {\n messageQueue.push(event.data);\n }\n};\n\n// Signal ready after a timeout to ensure main thread handler is set\nsetTimeout(() => {\n isReady = true;\n processQueue();\n self.postMessage({ type: 'ready' });\n}, 10);\n`;\n\n// --- Helper functions ---\n\nfunction createStats(result: KernelResult): Stats {\n // Support both new format (type, mtimeMs) and legacy format (isFile, isDirectory, mtime)\n const isFile = result.type ? result.type === 'file' : (result.isFile ?? false);\n const isDir = result.type ? result.type === 'directory' : (result.isDirectory ?? false);\n const mtimeMs = result.mtimeMs ?? result.mtime ?? Date.now();\n const size = result.size ?? 0;\n const mode = result.mode ?? (isDir ? 16877 : 33188);\n\n return {\n isFile: () => isFile,\n isDirectory: () => isDir,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n dev: 0,\n ino: 0,\n mode,\n nlink: 1,\n uid: 0,\n gid: 0,\n rdev: 0,\n size,\n blksize: 4096,\n blocks: Math.ceil(size / 512),\n atimeMs: mtimeMs,\n mtimeMs,\n ctimeMs: mtimeMs,\n birthtimeMs: mtimeMs,\n atime: new Date(mtimeMs),\n mtime: new Date(mtimeMs),\n ctime: new Date(mtimeMs),\n birthtime: new Date(mtimeMs),\n };\n}\n\nfunction createDirent(name: string, isDir: boolean): Dirent {\n return {\n name,\n isFile: () => !isDir,\n isDirectory: () => isDir,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isSymbolicLink: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 15);\n}\n\nfunction encodeData(data: Uint8Array | string | ArrayBufferView | ArrayBuffer, _encoding?: Encoding): Uint8Array {\n if (typeof data === 'string') {\n return new TextEncoder().encode(data);\n }\n if (data instanceof Uint8Array) {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n // Fallback for unknown types - convert to string\n return new TextEncoder().encode(String(data ?? ''));\n}\n\nfunction decodeData(data: Uint8Array, encoding?: Encoding | null): Uint8Array | string {\n if (encoding === 'utf8' || encoding === 'utf-8') {\n return new TextDecoder().decode(data);\n }\n return data;\n}\n\n// File descriptor entry for low-level read/write operations\ninterface FileDescriptor {\n path: string;\n flags: number;\n position: number;\n}\n\nexport class OPFSFileSystem {\n private worker: Worker | null = null;\n private pending = new Map<string, { resolve: (v: KernelResult) => void; reject: (e: Error) => void; path: string; type: string }>();\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n\n // File descriptor table for openSync/readSync/writeSync/closeSync\n private fdTable = new Map<number, FileDescriptor>();\n private nextFd = 3; // Start at 3 (0=stdin, 1=stdout, 2=stderr)\n\n // Stat cache - reduces FS traffic by 30-50% for git operations\n private statCache = new Map<string, Stats>();\n\n constructor() {\n // Auto-initialize worker for fast async operations\n this.initWorker();\n }\n\n // Invalidate stat cache for a path (and parent for directory operations)\n private invalidateStat(filePath: string): void {\n const absPath = path.normalize(path.resolve(filePath));\n this.statCache.delete(absPath);\n // Also invalidate parent directory (for readdir caching if added later)\n const parent = path.dirname(absPath);\n if (parent !== absPath) {\n this.statCache.delete(parent);\n }\n }\n\n // Invalidate all stats under a directory (for recursive operations)\n private invalidateStatsUnder(dirPath: string): void {\n const prefix = path.normalize(path.resolve(dirPath));\n for (const key of this.statCache.keys()) {\n if (key === prefix || key.startsWith(prefix + '/')) {\n this.statCache.delete(key);\n }\n }\n }\n\n private async initWorker(): Promise<void> {\n if (this.initialized) return;\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n const blob = new Blob([KERNEL_SOURCE], { type: 'application/javascript' });\n this.worker = new Worker(URL.createObjectURL(blob));\n\n // Set up message handler FIRST, before worker can send 'ready'\n const readyPromise = new Promise<void>((resolve) => {\n this.worker!.onmessage = (event: MessageEvent<KernelResponse>) => {\n const { id, result, error, code, type: msgType } = event.data;\n\n // Handle ready signal\n if (msgType === 'ready') {\n resolve();\n return;\n }\n\n const pending = this.pending.get(id);\n if (pending) {\n this.pending.delete(id);\n if (error) {\n // Map DOM exception names to Node.js-style error codes\n // Use stored path from pending request (more reliable than extracting from error)\n const errCode = code || 'Error';\n if (errCode === 'NotFoundError' || errCode === 'NotAllowedError' ||\n errCode === 'TypeMismatchError' || errCode === 'InvalidModificationError' ||\n errCode === 'QuotaExceededError') {\n pending.reject(mapErrorCode(errCode, pending.type, pending.path));\n } else {\n pending.reject(new FSError(errCode, -1, `${error}: ${pending.type} '${pending.path}'`));\n }\n } else if (result) {\n pending.resolve(result);\n }\n }\n };\n });\n\n await readyPromise;\n this.initialized = true;\n })();\n\n return this.initPromise;\n }\n\n // Async call to worker - uses fast createSyncAccessHandle internally\n private async asyncCall(\n type: string,\n filePath: string,\n payload?: Record<string, unknown>\n ): Promise<KernelResult> {\n await this.initWorker();\n\n if (!this.worker) {\n throw new Error('Worker not initialized');\n }\n\n const absPath = path.resolve(filePath);\n const id = generateId();\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject, path: absPath, type });\n\n const msg = {\n id,\n type,\n path: absPath,\n payload,\n };\n\n // Transfer ArrayBuffer if payload contains data (for writes)\n if (payload?.data instanceof Uint8Array) {\n // Clone the data since we're transferring - caller might still need original\n const clone = new Uint8Array(payload.data);\n const newPayload = { ...payload, data: clone };\n this.worker!.postMessage({ ...msg, payload: newPayload }, [clone.buffer]);\n } else {\n this.worker!.postMessage(msg);\n }\n });\n }\n\n // Kernel worker for Tier 1 sync operations (loaded from URL, not blob)\n private syncKernel: Worker | null = null;\n private syncKernelReady = false;\n\n /**\n * Initialize sync operations with a kernel worker loaded from URL.\n * Required for Tier 1 (SharedArrayBuffer + Atomics) to work in nested Workers.\n * @param kernelUrl URL to the kernel.js file (defaults to '/kernel.js')\n */\n async initSync(kernelUrl = '/kernel.js'): Promise<void> {\n if (this.syncKernelReady) return;\n\n this.syncKernel = new Worker(kernelUrl, { type: 'module' });\n\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => reject(new Error('Kernel init timeout')), 10000);\n this.syncKernel!.onmessage = (e) => {\n if (e.data?.type === 'ready') {\n clearTimeout(timeout);\n this.syncKernelReady = true;\n resolve();\n }\n };\n this.syncKernel!.onerror = (e) => {\n clearTimeout(timeout);\n reject(new Error(`Kernel error: ${e.message}`));\n };\n });\n }\n\n // Tier 1: SharedArrayBuffer + Atomics via kernel worker\n // Data is transferred via SharedArrayBuffer (zero-copy)\n // Synchronization via Atomics.wait/notify\n\n // Buffer sizes for Tier 1 communication\n private static readonly META_SIZE = 1024 * 64; // 64KB for metadata/results\n private static readonly DEFAULT_DATA_SIZE = 1024 * 1024 * 10; // 10MB default buffer\n private static readonly MAX_CHUNK_SIZE = 1024 * 1024 * 10; // 10MB max per chunk\n\n // Reusable SharedArrayBuffer pool to prevent memory leaks\n // SharedArrayBuffers are expensive to allocate and don't get GC'd quickly\n private syncBufferPool: {\n ctrl: SharedArrayBuffer;\n meta: SharedArrayBuffer;\n data: SharedArrayBuffer;\n dataSize: number;\n } | null = null;\n\n private getSyncBuffers(requiredDataSize: number): {\n ctrlBuffer: SharedArrayBuffer;\n ctrl: Int32Array;\n metaBuffer: SharedArrayBuffer;\n dataBuffer: SharedArrayBuffer;\n } {\n // Reuse existing buffers if they're large enough\n if (this.syncBufferPool && this.syncBufferPool.dataSize >= requiredDataSize) {\n return {\n ctrlBuffer: this.syncBufferPool.ctrl,\n ctrl: new Int32Array(this.syncBufferPool.ctrl),\n metaBuffer: this.syncBufferPool.meta,\n dataBuffer: this.syncBufferPool.data,\n };\n }\n\n // Allocate new buffers (or larger ones if needed)\n const dataSize = Math.max(\n OPFSFileSystem.DEFAULT_DATA_SIZE,\n Math.min(requiredDataSize + 1024, 1024 * 1024 * 64) // Up to 64MB\n );\n\n const ctrlBuffer = new SharedArrayBuffer(4);\n const metaBuffer = new SharedArrayBuffer(OPFSFileSystem.META_SIZE);\n const dataBuffer = new SharedArrayBuffer(dataSize);\n\n // Store in pool for reuse\n this.syncBufferPool = {\n ctrl: ctrlBuffer,\n meta: metaBuffer,\n data: dataBuffer,\n dataSize,\n };\n\n return {\n ctrlBuffer,\n ctrl: new Int32Array(ctrlBuffer),\n metaBuffer,\n dataBuffer,\n };\n }\n\n private syncCallTier1(\n type: string,\n filePath: string,\n payload?: Record<string, unknown>\n ): KernelResult {\n if (!this.syncKernel || !this.syncKernelReady) {\n throw new Error('Sync kernel not initialized. Call initSync() first.');\n }\n\n // Path normalization: resolve and normalize to ensure consistent paths\n // e.g., /foo/bar, foo/bar/, and /foo//bar all become /foo/bar\n const absPath = path.normalize(path.resolve(filePath));\n\n const data = payload?.data instanceof Uint8Array ? payload.data : null;\n const dataSize = data?.length ?? 0;\n\n // For large writes, use chunked approach\n if (type === 'write' && data && dataSize > OPFSFileSystem.MAX_CHUNK_SIZE) {\n return this.syncCallTier1Chunked(absPath, data);\n }\n\n // Get reusable SharedArrayBuffers from pool (prevents memory leaks)\n const { ctrlBuffer, ctrl, metaBuffer, dataBuffer } = this.getSyncBuffers(dataSize);\n\n // Initialize control signal to \"waiting\"\n Atomics.store(ctrl, 0, 0);\n\n // For write operations, copy data to SharedArrayBuffer\n let dataLength = 0;\n if (data) {\n const view = new Uint8Array(dataBuffer);\n view.set(data);\n dataLength = data.length;\n }\n\n // Send command to kernel with SharedArrayBuffers\n this.syncKernel.postMessage({\n type,\n path: absPath,\n ctrlBuffer,\n metaBuffer,\n dataBuffer,\n dataLength,\n payload: payload ? { ...payload, data: undefined } : undefined,\n });\n\n // Block until kernel signals completion\n const waitResult = Atomics.wait(ctrl, 0, 0, 30000);\n if (waitResult === 'timed-out') {\n throw new Error('Operation timed out');\n }\n\n const status = Atomics.load(ctrl, 0);\n\n // Status codes:\n // > 0: success, value indicates data length or result\n // -1: error (error message in metaBuffer)\n // -2: not found\n\n if (status === -1) {\n const metaView = new Uint8Array(metaBuffer);\n let end = metaView.indexOf(0);\n if (end === -1) end = OPFSFileSystem.META_SIZE;\n const errorMsg = new TextDecoder().decode(metaView.slice(0, end));\n throw mapErrorCode(errorMsg || 'Error', type, absPath);\n }\n\n if (status === -2) {\n throw createENOENT(type, absPath);\n }\n\n // Parse result based on operation type\n if (type === 'read') {\n const bytesRead = status;\n const bufferSize = dataBuffer.byteLength;\n\n // If we filled the buffer completely, there might be more data\n // Use stat to check total size and switch to chunked read if needed\n if (bytesRead === bufferSize) {\n const stat = this.syncStatTier1(absPath);\n if (stat && stat.size > bytesRead) {\n // File is larger than buffer, use chunked read from the beginning\n return this.syncCallTier1ChunkedRead(absPath, stat.size);\n }\n }\n\n const dataView = new Uint8Array(dataBuffer);\n return { data: dataView.slice(0, bytesRead) };\n }\n\n if (type === 'stat') {\n // Binary stat: [type:u8] [pad:3] [mode:u32] [size:f64] [mtimeMs:f64]\n const view = new DataView(metaBuffer);\n const typeVal = view.getUint8(0);\n return {\n type: typeVal === 0 ? 'file' : 'directory',\n mode: view.getUint32(4, true),\n size: view.getFloat64(8, true),\n mtimeMs: view.getFloat64(16, true),\n };\n }\n\n if (type === 'readdir') {\n // Binary readdir: [count:u32] [len:u16 + utf8]...\n const view = new DataView(metaBuffer);\n const bytes = new Uint8Array(metaBuffer);\n const count = view.getUint32(0, true);\n const entries: string[] = [];\n let offset = 4;\n for (let i = 0; i < count; i++) {\n const len = view.getUint16(offset, true);\n offset += 2;\n // Use slice() instead of subarray() to copy from SharedArrayBuffer (TextDecoder requires regular ArrayBuffer)\n const name = new TextDecoder().decode(bytes.slice(offset, offset + len));\n entries.push(name);\n offset += len;\n }\n return { entries };\n }\n\n if (type === 'exists') {\n return { exists: status === 1 };\n }\n\n return { success: status === 1 };\n }\n\n // Mutex for async operations to prevent buffer reuse race conditions\n // Multiple concurrent Atomics.waitAsync calls would share the same buffer pool,\n // causing data corruption when operations complete out of order\n private asyncOperationPromise: Promise<void> = Promise.resolve();\n\n // Async version of syncCallTier1 using Atomics.waitAsync (works on main thread)\n // This allows the main thread to use the fast SharedArrayBuffer path without blocking\n // IMPORTANT: Operations are serialized to prevent buffer reuse race conditions\n private async syncCallTier1Async(\n type: string,\n filePath: string,\n payload?: Record<string, unknown>\n ): Promise<KernelResult> {\n // Serialize async operations to prevent buffer reuse race conditions\n const previousOp = this.asyncOperationPromise;\n let resolveCurrentOp: () => void;\n this.asyncOperationPromise = new Promise(resolve => { resolveCurrentOp = resolve; });\n\n try {\n // Wait for previous operation to complete\n await previousOp;\n return await this.syncCallTier1AsyncImpl(type, filePath, payload);\n } finally {\n // Signal that this operation is complete\n resolveCurrentOp!();\n }\n }\n\n // Implementation of async Tier 1 call (called after serialization)\n private async syncCallTier1AsyncImpl(\n type: string,\n filePath: string,\n payload?: Record<string, unknown>\n ): Promise<KernelResult> {\n if (!this.syncKernel || !this.syncKernelReady) {\n throw new Error('Sync kernel not initialized. Call initSync() first.');\n }\n\n const absPath = path.normalize(path.resolve(filePath));\n const data = payload?.data instanceof Uint8Array ? payload.data : null;\n const dataSize = data?.length ?? 0;\n\n // For large writes, use chunked approach (async version)\n if (type === 'write' && data && dataSize > OPFSFileSystem.MAX_CHUNK_SIZE) {\n return this.syncCallTier1ChunkedAsync(absPath, data);\n }\n\n const { ctrlBuffer, ctrl, metaBuffer, dataBuffer } = this.getSyncBuffers(dataSize);\n\n Atomics.store(ctrl, 0, 0);\n\n let dataLength = 0;\n if (data) {\n const view = new Uint8Array(dataBuffer);\n view.set(data);\n dataLength = data.length;\n }\n\n this.syncKernel.postMessage({\n type,\n path: absPath,\n ctrlBuffer,\n metaBuffer,\n dataBuffer,\n dataLength,\n payload: payload ? { ...payload, data: undefined } : undefined,\n });\n\n // Use Atomics.waitAsync for non-blocking wait (works on main thread)\n const waitResult = await Atomics.waitAsync(ctrl, 0, 0, 30000).value;\n if (waitResult === 'timed-out') {\n throw new Error('Operation timed out');\n }\n\n const status = Atomics.load(ctrl, 0);\n\n if (status === -1) {\n const metaView = new Uint8Array(metaBuffer);\n let end = metaView.indexOf(0);\n if (end === -1) end = OPFSFileSystem.META_SIZE;\n const errorMsg = new TextDecoder().decode(metaView.slice(0, end));\n throw mapErrorCode(errorMsg || 'Error', type, absPath);\n }\n\n if (status === -2) {\n throw createENOENT(type, absPath);\n }\n\n // Parse result based on operation type\n if (type === 'read') {\n const bytesRead = status;\n const bufferSize = dataBuffer.byteLength;\n\n if (bytesRead === bufferSize) {\n const stat = await this.syncStatTier1Async(absPath);\n if (stat && stat.size > bytesRead) {\n return this.syncCallTier1ChunkedReadAsync(absPath, stat.size);\n }\n }\n\n const dataView = new Uint8Array(dataBuffer);\n return { data: dataView.slice(0, bytesRead) };\n }\n\n if (type === 'stat') {\n const view = new DataView(metaBuffer);\n const typeVal = view.getUint8(0);\n return {\n type: typeVal === 0 ? 'file' : 'directory',\n mode: view.getUint32(4, true),\n size: view.getFloat64(8, true),\n mtimeMs: view.getFloat64(16, true),\n };\n }\n\n if (type === 'readdir') {\n const view = new DataView(metaBuffer);\n const bytes = new Uint8Array(metaBuffer);\n const count = view.getUint32(0, true);\n const entries: string[] = [];\n let offset = 4;\n for (let i = 0; i < count; i++) {\n const len = view.getUint16(offset, true);\n offset += 2;\n // Use slice() instead of subarray() to copy from SharedArrayBuffer (TextDecoder requires regular ArrayBuffer)\n const name = new TextDecoder().decode(bytes.slice(offset, offset + len));\n entries.push(name);\n offset += len;\n }\n return { entries };\n }\n\n if (type === 'exists') {\n return { exists: status === 1 };\n }\n\n return { success: status === 1 };\n }\n\n // Async stat helper for main thread\n // NOTE: Called from within syncCallTier1AsyncImpl, so uses impl directly to avoid deadlock\n private async syncStatTier1Async(absPath: string): Promise<{ size: number } | null> {\n try {\n const result = await this.syncCallTier1AsyncImpl('stat', absPath);\n return { size: result.size as number };\n } catch {\n return null;\n }\n }\n\n // Async chunked write for main thread\n private async syncCallTier1ChunkedAsync(\n absPath: string,\n data: Uint8Array\n ): Promise<KernelResult> {\n const totalSize = data.length;\n let offset = 0;\n\n while (offset < totalSize) {\n const remaining = totalSize - offset;\n const currentChunkSize = Math.min(remaining, OPFSFileSystem.MAX_CHUNK_SIZE);\n const chunk = data.subarray(offset, offset + currentChunkSize);\n\n const { ctrlBuffer, ctrl, metaBuffer, dataBuffer } = this.getSyncBuffers(currentChunkSize);\n Atomics.store(ctrl, 0, 0);\n\n const view = new Uint8Array(dataBuffer);\n view.set(chunk);\n\n const isFirstChunk = offset === 0;\n this.syncKernel!.postMessage({\n type: isFirstChunk ? 'write' : 'append',\n path: absPath,\n ctrlBuffer,\n metaBuffer,\n dataBuffer,\n dataLength: currentChunkSize,\n payload: { flush: false },\n });\n\n const waitResult = await Atomics.waitAsync(ctrl, 0, 0, 30000).value;\n if (waitResult === 'timed-out') {\n throw new Error('Chunked write timed out');\n }\n\n const status = Atomics.load(ctrl, 0);\n if (status === -1 || status === -2) {\n throw createENOENT('write', absPath);\n }\n\n offset += currentChunkSize;\n }\n\n return { success: true };\n }\n\n // Async chunked read for main thread\n private async syncCallTier1ChunkedReadAsync(\n absPath: string,\n totalSize: number\n ): Promise<KernelResult> {\n const result = new Uint8Array(totalSize);\n let offset = 0;\n\n while (offset < totalSize) {\n const remaining = totalSize - offset;\n const currentChunkSize = Math.min(remaining, OPFSFileSystem.MAX_CHUNK_SIZE);\n\n const { ctrlBuffer, ctrl, metaBuffer, dataBuffer } = this.getSyncBuffers(currentChunkSize);\n Atomics.store(ctrl, 0, 0);\n\n this.syncKernel!.postMessage({\n type: 'readChunk',\n path: absPath,\n ctrlBuffer,\n metaBuffer,\n dataBuffer,\n dataLength: 0,\n payload: { offset, length: currentChunkSize },\n });\n\n const waitResult = await Atomics.waitAsync(ctrl, 0, 0, 30000).value;\n if (waitResult === 'timed-out') {\n throw new Error('Chunked read timed out');\n }\n\n const status = Atomics.load(ctrl, 0);\n if (status === -1 || status === -2) {\n throw createENOENT('read', absPath);\n }\n\n const bytesRead = status;\n const dataView = new Uint8Array(dataBuffer);\n result.set(dataView.subarray(0, bytesRead), offset);\n offset += bytesRead;\n }\n\n return { data: result };\n }\n\n // Chunked write for files larger than MAX_CHUNK_SIZE\n private syncCallTier1Chunked(\n absPath: string,\n data: Uint8Array\n ): KernelResult {\n const totalSize = data.length;\n const chunkSize = OPFSFileSystem.MAX_CHUNK_SIZE;\n\n // Reuse buffers from pool (prevents memory leaks)\n const { ctrlBuffer, ctrl, metaBuffer, dataBuffer } = this.getSyncBuffers(chunkSize);\n const dataView = new Uint8Array(dataBuffer);\n\n let offset = 0;\n while (offset < totalSize) {\n const remaining = totalSize - offset;\n const currentChunkSize = Math.min(chunkSize, remaining);\n const chunk = data.subarray(offset, offset + currentChunkSize);\n\n // Reset control signal\n Atomics.store(ctrl, 0, 0);\n\n // Copy chunk to SharedArrayBuffer\n dataView.set(chunk);\n\n // First chunk: truncate file (offset 0), subsequent chunks: append at offset\n this.syncKernel!.postMessage({\n type: 'write',\n path: absPath,\n ctrlBuffer,\n metaBuffer,\n dataBuffer,\n dataLength: currentChunkSize,\n payload: { offset }, // Kernel writes at this offset\n });\n\n // Wait for completion\n const waitResult = Atomics.wait(ctrl, 0, 0, 60000); // Longer timeout for large chunks\n if (waitResult === 'timed-out') {\n throw new Error(`Chunked write timed out at offset ${offset}`);\n }\n\n const status = Atomics.load(ctrl, 0);\n if (status === -1) {\n const metaView = new Uint8Array(metaBuffer);\n let end = metaView.indexOf(0);\n if (end === -1) end = OPFSFileSystem.META_SIZE;\n const errorMsg = new TextDecoder().decode(metaView.slice(0, end));\n throw mapErrorCode(errorMsg || 'Error', 'write', absPath);\n }\n if (status === -2) {\n throw createENOENT('write', absPath);\n }\n\n offset += currentChunkSize;\n }\n\n return { success: true };\n }\n\n // Chunked read for files larger than buffer size\n private syncCallTier1ChunkedRead(\n absPath: string,\n totalSize: number\n ): KernelResult {\n const chunkSize = OPFSFileSystem.MAX_CHUNK_SIZE;\n\n // Allocate result buffer on main thread\n const result = new Uint8Array(totalSize);\n\n // Reuse buffers from pool (prevents memory leaks)\n const { ctrlBuffer, ctrl, metaBuffer, dataBuffer } = this.getSyncBuffers(chunkSize);\n\n let offset = 0;\n while (offset < totalSize) {\n const remaining = totalSize - offset;\n const currentChunkSize = Math.min(chunkSize, remaining);\n\n // Reset control signal\n Atomics.store(ctrl, 0, 0);\n\n // Request chunk from kernel\n this.syncKernel!.postMessage({\n type: 'read',\n path: absPath,\n ctrlBuffer,\n metaBuffer,\n dataBuffer,\n dataLength: 0,\n payload: { offset, len: currentChunkSize },\n });\n\n // Wait for completion\n const waitResult = Atomics.wait(ctrl, 0, 0, 60000);\n if (waitResult === 'timed-out') {\n throw new Error(`Chunked read timed out at offset ${offset}`);\n }\n\n const status = Atomics.load(ctrl, 0);\n if (status === -1) {\n const metaView = new Uint8Array(metaBuffer);\n let end = metaView.indexOf(0);\n if (end === -1) end = OPFSFileSystem.META_SIZE;\n const errorMsg = new TextDecoder().decode(metaView.slice(0, end));\n throw mapErrorCode(errorMsg || 'Error', 'read', absPath);\n }\n if (status === -2) {\n throw createENOENT('read', absPath);\n }\n\n // Copy chunk from SharedArrayBuffer to result\n const bytesRead = status;\n const dataView = new Uint8Array(dataBuffer, 0, bytesRead);\n result.set(dataView, offset);\n\n offset += bytesRead;\n\n // If we read less than requested, we've reached EOF\n if (bytesRead < currentChunkSize) {\n break;\n }\n }\n\n return { data: result.subarray(0, offset) };\n }\n\n // Get file size via stat (used for chunked reads)\n private syncStatTier1(absPath: string): { size: number } | null {\n // Reuse buffers from pool (prevents memory leaks)\n const { ctrlBuffer, ctrl, metaBuffer, dataBuffer } = this.getSyncBuffers(1024);\n\n Atomics.store(ctrl, 0, 0);\n\n this.syncKernel!.postMessage({\n type: 'stat',\n path: absPath,\n ctrlBuffer,\n metaBuffer,\n dataBuffer,\n dataLength: 0,\n });\n\n const waitResult = Atomics.wait(ctrl, 0, 0, 10000);\n if (waitResult === 'timed-out') {\n return null;\n }\n\n const status = Atomics.load(ctrl, 0);\n if (status <= 0) {\n return null;\n }\n\n // Binary stat: [type:u8] [pad:3] [mode:u32] [size:f64] [mtimeMs:f64]\n const view = new DataView(metaBuffer);\n return { size: view.getFloat64(8, true) };\n }\n\n private syncCall(\n type: string,\n filePath: string,\n payload?: Record<string, unknown>\n ): KernelResult {\n // Sync operations require SharedArrayBuffer + Atomics\n // This requires crossOriginIsolated (COOP/COEP headers) and initSync() to be called\n if (\n isWorkerContext &&\n typeof SharedArrayBuffer !== 'undefined' &&\n this.syncKernelReady\n ) {\n return this.syncCallTier1(type, filePath, payload);\n }\n\n // No sync tier available - throw helpful error\n throw new Error(\n `Sync operations require crossOriginIsolated environment (COOP/COEP headers) and initSync() to be called. ` +\n `Current state: crossOriginIsolated=${typeof crossOriginIsolated !== 'undefined' ? crossOriginIsolated : 'N/A'}, ` +\n `isWorkerContext=${isWorkerContext}, syncKernelReady=${this.syncKernelReady}. ` +\n `Use fs.promises.* for async operations that work everywhere.`\n );\n }\n\n // --- Synchronous API (Node.js fs compatible) ---\n\n readFileSync(filePath: string, options?: ReadOptions | Encoding | null): Uint8Array | string {\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const result = this.syncCall('read', filePath);\n if (!result.data) throw createENOENT('read', filePath);\n return decodeData(result.data, encoding);\n }\n\n writeFileSync(filePath: string, data: Uint8Array | string, options?: WriteOptions | Encoding): void {\n const opts = typeof options === 'string' ? { encoding: options } : options;\n const encoded = encodeData(data, opts?.encoding);\n // Pass flush option (defaults to true in kernel for safety)\n this.syncCall('write', filePath, { data: encoded, flush: opts?.flush });\n this.invalidateStat(filePath);\n }\n\n appendFileSync(filePath: string, data: Uint8Array | string, options?: WriteOptions | Encoding): void {\n const encoding = typeof options === 'string' ? options : options?.encoding;\n const encoded = encodeData(data, encoding);\n this.syncCall('append', filePath, { data: encoded });\n this.invalidateStat(filePath);\n }\n\n existsSync(filePath: string): boolean {\n try {\n const result = this.syncCall('exists', filePath);\n return result.exists ?? false;\n } catch {\n return false;\n }\n }\n\n mkdirSync(filePath: string, options?: MkdirOptions | number): string | undefined {\n const recursive = typeof options === 'object' ? options?.recursive : false;\n this.syncCall('mkdir', filePath, { recursive });\n this.invalidateStat(filePath);\n return recursive ? filePath : undefined;\n }\n\n rmdirSync(filePath: string, options?: RmdirOptions): void {\n this.syncCall('rmdir', filePath, { recursive: options?.recursive });\n if (options?.recursive) {\n this.invalidateStatsUnder(filePath);\n } else {\n this.invalidateStat(filePath);\n }\n }\n\n rmSync(filePath: string, options?: RmOptions): void {\n try {\n const result = this.syncCall('stat', filePath);\n try {\n if (result.isDirectory || result.type === 'directory') {\n this.syncCall('rmdir', filePath, { recursive: options?.recursive });\n if (options?.recursive) {\n this.invalidateStatsUnder(filePath);\n } else {\n this.invalidateStat(filePath);\n }\n } else {\n this.syncCall('unlink', filePath);\n this.invalidateStat(filePath);\n }\n } catch (e) {\n // Handle errors from rmdir/unlink with force option\n if (!options?.force) throw e;\n }\n } catch (e) {\n // Handle errors from stat with force option\n if (!options?.force) throw e;\n }\n }\n\n unlinkSync(filePath: string): void {\n this.syncCall('unlink', filePath);\n this.invalidateStat(filePath);\n }\n\n readdirSync(filePath: string, options?: ReaddirOptions | Encoding | null): string[] | Dirent[] {\n const result = this.syncCall('readdir', filePath);\n const entries = result.entries || [];\n\n const opts = typeof options === 'object' ? options : { encoding: options };\n\n if (opts?.withFileTypes) {\n return entries.map((name) => {\n try {\n const stat = this.syncCall('stat', path.join(filePath, name));\n // Check type first (from kernel result), fall back to isDirectory boolean\n const isDir = stat.type === 'directory' || stat.isDirectory === true;\n return createDirent(name, isDir);\n } catch {\n return createDirent(name, false);\n }\n });\n }\n\n return entries;\n }\n\n statSync(filePath: string): Stats {\n const absPath = path.normalize(path.resolve(filePath));\n\n // Check cache first\n const cached = this.statCache.get(absPath);\n if (cached) return cached;\n\n const result = this.syncCall('stat', filePath);\n // Check for both new format (type) and legacy format (isFile/isDirectory)\n if (result.type === undefined && result.isFile === undefined && result.isDirectory === undefined) {\n throw createENOENT('stat', filePath);\n }\n const stats = createStats(result);\n\n // Cache the result\n this.statCache.set(absPath, stats);\n return stats;\n }\n\n lstatSync(filePath: string): Stats {\n const stats = this.statSync(filePath);\n // Check if it's a symlink and update the stats accordingly\n if (stats.isFile() && this.isSymlinkSync(filePath)) {\n return this.createSymlinkStats(stats);\n }\n return stats;\n }\n\n /**\n * Create stats object for a symlink file.\n */\n private createSymlinkStats(baseStats: Stats): Stats {\n return {\n ...baseStats,\n isFile: () => false,\n isSymbolicLink: () => true,\n // Symlink mode: 0o120777 (41471 decimal)\n mode: 41471,\n };\n }\n\n renameSync(oldPath: string, newPath: string): void {\n this.syncCall('rename', oldPath, { newPath });\n this.invalidateStat(oldPath);\n this.invalidateStat(newPath);\n }\n\n copyFileSync(src: string, dest: string): void {\n this.syncCall('copy', src, { newPath: dest });\n this.invalidateStat(dest);\n }\n\n truncateSync(filePath: string, len = 0): void {\n this.syncCall('truncate', filePath, { len });\n this.invalidateStat(filePath);\n }\n\n /**\n * Flush all pending writes to storage.\n * Use this after writes with { flush: false } to ensure data is persisted.\n */\n flushSync(): void {\n this.syncCall('flush', '/');\n }\n\n /**\n * Alias for flushSync() - matches Node.js fdatasync behavior\n */\n fdatasyncSync(): void {\n this.flushSync();\n }\n\n /**\n * Purge all kernel caches (sync handles, directory handles).\n * Use between major operations to ensure clean state.\n */\n purgeSync(): void {\n this.syncCall('purge', '/');\n this.statCache.clear();\n }\n\n accessSync(filePath: string, _mode?: number): void {\n const exists = this.existsSync(filePath);\n if (!exists) {\n throw createENOENT('access', filePath);\n }\n }\n\n // --- Low-level File Descriptor API ---\n // For efficient packfile access (read specific offsets without loading entire file)\n\n openSync(filePath: string, flags: string | number = 'r'): number {\n // Verify file exists for read modes\n const flagNum = typeof flags === 'string' ? this.parseFlags(flags) : flags;\n const isReadOnly = (flagNum & constants.O_WRONLY) === 0 && (flagNum & constants.O_RDWR) === 0;\n\n if (isReadOnly && !this.existsSync(filePath)) {\n throw createENOENT('open', filePath);\n }\n\n const fd = this.nextFd++;\n this.fdTable.set(fd, {\n path: path.normalize(path.resolve(filePath)),\n flags: flagNum,\n position: 0,\n });\n return fd;\n }\n\n closeSync(fd: number): void {\n if (!this.fdTable.has(fd)) {\n throw new FSError('EBADF', -9, `bad file descriptor: ${fd}`);\n }\n this.fdTable.delete(fd);\n }\n\n readSync(\n fd: number,\n buffer: Uint8Array,\n offset: number,\n length: number,\n position: number | null\n ): number {\n const entry = this.fdTable.get(fd);\n if (!entry) {\n throw new FSError('EBADF', -9, `bad file descriptor: ${fd}`);\n }\n\n const readPos = position !== null ? position : entry.position;\n const result = this.syncCall('read', entry.path, { offset: readPos, len: length });\n\n if (!result.data) {\n return 0; // EOF or error\n }\n\n // Copy data into the provided buffer at the specified offset\n const bytesRead = Math.min(result.data.length, length);\n buffer.set(result.data.subarray(0, bytesRead), offset);\n\n // Update position if not using explicit position\n if (position === null) {\n entry.position += bytesRead;\n }\n\n return bytesRead;\n }\n\n writeSync(\n fd: number,\n buffer: Uint8Array,\n offset: number,\n length: number,\n position: number | null\n ): number {\n const entry = this.fdTable.get(fd);\n if (!entry) {\n throw new FSError('EBADF', -9, `bad file descriptor: ${fd}`);\n }\n\n const writePos = position !== null ? position : entry.position;\n const data = buffer.subarray(offset, offset + length);\n\n // Use truncate: false to avoid truncating on positional writes\n this.syncCall('write', entry.path, {\n data,\n offset: writePos,\n truncate: false,\n });\n\n // Invalidate stat cache after write\n this.invalidateStat(entry.path);\n\n // Update position if not using explicit position\n if (position === null) {\n entry.position += length;\n }\n\n return length;\n }\n\n fstatSync(fd: number): Stats {\n const entry = this.fdTable.get(fd);\n if (!entry) {\n throw new FSError('EBADF', -9, `bad file descriptor: ${fd}`);\n }\n return this.statSync(entry.path);\n }\n\n ftruncateSync(fd: number, len = 0): void {\n const entry = this.fdTable.get(fd);\n if (!entry) {\n throw new FSError('EBADF', -9, `bad file descriptor: ${fd}`);\n }\n this.truncateSync(entry.path, len);\n }\n\n /**\n * Resolve a path to an absolute path.\n * OPFS doesn't support symlinks, so this just normalizes the path.\n */\n realpathSync(filePath: string): string {\n // Verify the path exists\n this.accessSync(filePath);\n return path.normalize(path.resolve(filePath));\n }\n\n /**\n * Change file mode (no-op in OPFS - permissions not supported).\n */\n chmodSync(_filePath: string, _mode: number): void {\n // No-op: OPFS doesn't support file permissions\n }\n\n /**\n * Change file owner (no-op in OPFS - ownership not supported).\n */\n chownSync(_filePath: string, _uid: number, _gid: number): void {\n // No-op: OPFS doesn't support file ownership\n }\n\n /**\n * Change file timestamps (no-op in OPFS - timestamps are read-only).\n */\n utimesSync(_filePath: string, _atime: Date | number, _mtime: Date | number): void {\n // No-op: OPFS doesn't support modifying timestamps\n }\n\n // Magic prefix for symlink files - must be unique enough to not appear in regular files\n private static readonly SYMLINK_MAGIC = 'OPFS_SYMLINK_V1:';\n\n /**\n * Create a symbolic link.\n * Emulated by storing target path in a special file format.\n */\n symlinkSync(target: string, filePath: string, _type?: string): void {\n const content = OPFSFileSystem.SYMLINK_MAGIC + target;\n this.writeFileSync(filePath, content);\n }\n\n /**\n * Read a symbolic link target.\n */\n readlinkSync(filePath: string): string {\n const content = this.readFileSync(filePath, { encoding: 'utf8' }) as string;\n if (!content.startsWith(OPFSFileSystem.SYMLINK_MAGIC)) {\n throw new FSError('EINVAL', -22, `EINVAL: invalid argument, readlink '${filePath}'`, 'readlink', filePath);\n }\n return content.slice(OPFSFileSystem.SYMLINK_MAGIC.length);\n }\n\n /**\n * Check if a file is a symlink (sync).\n */\n private isSymlinkSync(filePath: string): boolean {\n try {\n const content = this.readFileSync(filePath, { encoding: 'utf8' }) as string;\n return content.startsWith(OPFSFileSystem.SYMLINK_MAGIC);\n } catch {\n return false;\n }\n }\n\n /**\n * Check if a file is a symlink (async).\n */\n private async isSymlinkAsync(filePath: string): Promise<boolean> {\n try {\n const content = await this.promises.readFile(filePath, { encoding: 'utf8' }) as string;\n return content.startsWith(OPFSFileSystem.SYMLINK_MAGIC);\n } catch {\n return false;\n }\n }\n\n /**\n * Create a hard link.\n * Emulated by copying the file (true hard links not supported in OPFS).\n */\n linkSync(existingPath: string, newPath: string): void {\n // For symlinks, copy the symlink file itself (not the target)\n this.copyFileSync(existingPath, newPath);\n }\n\n private parseFlags(flags: string): number {\n switch (flags) {\n case 'r': return constants.O_RDONLY;\n case 'r+': return constants.O_RDWR;\n case 'w': return constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC;\n case 'w+': return constants.O_RDWR | constants.O_CREAT | constants.O_TRUNC;\n case 'a': return constants.O_WRONLY | constants.O_CREAT | constants.O_APPEND;\n case 'a+': return constants.O_RDWR | constants.O_CREAT | constants.O_APPEND;\n default: return constants.O_RDONLY;\n }\n }\n\n // --- Async Promises API ---\n // When Tier 1 sync kernel is available, use it for better performance (wrapped in Promise)\n // Otherwise fall back to async worker\n\n // Helper: Use sync kernel if available (in worker context), otherwise async worker\n private async fastCall(\n type: string,\n filePath: string,\n payload?: Record<string, unknown>\n ): Promise<KernelResult> {\n // Use sync kernel when available for best performance\n // Benefits of sync kernel:\n // 1. SharedArrayBuffer zero-copy data transfer\n // 2. Optimized sync handle caching\n // 3. No postMessage serialization overhead\n if (this.syncKernelReady) {\n if (isWorkerContext) {\n // In Worker: use blocking Atomics.wait (fastest)\n return Promise.resolve(this.syncCallTier1(type, filePath, payload));\n } else {\n // Main thread: use Atomics.waitAsync (non-blocking but still fast)\n return this.syncCallTier1Async(type, filePath, payload);\n }\n }\n // Fallback to async worker\n return this.asyncCall(type, filePath, payload);\n }\n\n promises: FileSystemPromises = {\n readFile: async (filePath: string, options?: ReadOptions | Encoding | null) => {\n // Validate path - isomorphic-git sometimes calls with no args\n if (!filePath) {\n throw createENOENT('read', filePath || '');\n }\n const encoding = typeof options === 'string' ? options : options?.encoding;\n\n // Use sync kernel if available (faster than async worker)\n if (this.syncKernelReady) {\n if (isWorkerContext) {\n // Worker: blocking wait (fastest)\n const result = this.syncCallTier1('read', filePath);\n if (!result.data) throw createENOENT('read', filePath);\n return decodeData(result.data, encoding);\n } else {\n // Main thread: use Atomics.waitAsync (non-blocking)\n const result = await this.syncCallTier1Async('read', filePath);\n if (!result.data) throw createENOENT('read', filePath);\n return decodeData(result.data, encoding);\n }\n }\n\n // Fallback to async worker (no sync kernel) - ensures consistent read/write path\n // Using asyncCall ensures reads go through same worker as writes,\n // which is important for file locking and cache consistency\n const result = await this.asyncCall('read', filePath);\n if (!result.data) throw createENOENT('read', filePath);\n return decodeData(result.data, encoding);\n },\n\n writeFile: async (filePath: string, data: Uint8Array | string, options?: WriteOptions | Encoding) => {\n const opts = typeof options === 'string' ? { encoding: options } : options;\n const encoded = encodeData(data, opts?.encoding);\n await this.fastCall('write', filePath, { data: encoded, flush: opts?.flush });\n this.invalidateStat(filePath);\n },\n\n appendFile: async (filePath: string, data: Uint8Array | string, options?: WriteOptions | Encoding) => {\n const opts = typeof options === 'string' ? { encoding: options } : options;\n const encoded = encodeData(data, opts?.encoding);\n await this.fastCall('append', filePath, { data: encoded, flush: opts?.flush });\n this.invalidateStat(filePath);\n },\n\n mkdir: async (filePath: string, options?: MkdirOptions | number) => {\n const recursive = typeof options === 'object' ? options?.recursive : false;\n await this.fastCall('mkdir', filePath, { recursive });\n return recursive ? filePath : undefined;\n },\n\n rmdir: async (filePath: string, options?: RmdirOptions) => {\n await this.fastCall('rmdir', filePath, { recursive: options?.recursive });\n },\n\n rm: async (filePath: string, options?: RmOptions) => {\n try {\n const result = await this.fastCall('stat', filePath);\n try {\n if (result.isDirectory || result.type === 'directory') {\n await this.fastCall('rmdir', filePath, { recursive: options?.recursive });\n if (options?.recursive) {\n this.invalidateStatsUnder(filePath);\n } else {\n this.invalidateStat(filePath);\n }\n } else {\n await this.fastCall('unlink', filePath);\n this.invalidateStat(filePath);\n }\n } catch (e) {\n // Handle errors from rmdir/unlink with force option\n if (!options?.force) throw e;\n }\n } catch (e) {\n // Handle errors from stat with force option\n if (!options?.force) throw e;\n }\n },\n\n unlink: async (filePath: string) => {\n await this.fastCall('unlink', filePath);\n },\n\n readdir: async (filePath: string, options?: ReaddirOptions | Encoding | null) => {\n const result = await this.fastCall('readdir', filePath);\n const entries = result.entries || [];\n const opts = typeof options === 'object' ? options : { encoding: options };\n\n if (opts?.withFileTypes) {\n const dirents: Dirent[] = [];\n for (const name of entries) {\n try {\n const stat = await this.fastCall('stat', path.join(filePath, name));\n // Check type first (from kernel result), fall back to isDirectory boolean\n const isDir = stat.type === 'directory' || stat.isDirectory === true;\n dirents.push(createDirent(name, isDir));\n } catch {\n dirents.push(createDirent(name, false));\n }\n }\n return dirents;\n }\n\n return entries;\n },\n\n stat: async (filePath: string) => {\n const result = await this.fastCall('stat', filePath);\n return createStats(result);\n },\n\n access: async (filePath: string, _mode?: number) => {\n const result = await this.fastCall('exists', filePath);\n if (!result.exists) {\n throw createENOENT('access', filePath);\n }\n },\n\n rename: async (oldFilePath: string, newFilePath: string) => {\n await this.fastCall('rename', oldFilePath, { newPath: path.resolve(newFilePath) });\n },\n\n copyFile: async (srcPath: string, destPath: string) => {\n await this.fastCall('copy', srcPath, { newPath: path.resolve(destPath) });\n },\n\n truncate: async (filePath: string, len = 0) => {\n await this.fastCall('truncate', filePath, { len });\n this.invalidateStat(filePath);\n },\n\n lstat: async (filePath: string) => {\n const result = await this.fastCall('stat', filePath);\n const stats = createStats(result);\n // Check if it's a symlink\n if (stats.isFile()) {\n const isSymlink = await this.isSymlinkAsync(filePath);\n if (isSymlink) {\n return this.createSymlinkStats(stats);\n }\n }\n return stats;\n },\n\n realpath: async (filePath: string) => {\n // Verify the path exists\n await this.promises.access(filePath);\n return path.normalize(path.resolve(filePath));\n },\n\n exists: async (filePath: string) => {\n try {\n const result = await this.fastCall('exists', filePath);\n return result.exists ?? false;\n } catch {\n return false;\n }\n },\n\n chmod: async (_filePath: string, _mode: number) => {\n // No-op: OPFS doesn't support file permissions\n },\n\n chown: async (_filePath: string, _uid: number, _gid: number) => {\n // No-op: OPFS doesn't support file ownership\n },\n\n utimes: async (_filePath: string, _atime: Date | number, _mtime: Date | number) => {\n // No-op: OPFS doesn't support modifying timestamps\n },\n\n symlink: async (target: string, filePath: string, _type?: string) => {\n const content = OPFSFileSystem.SYMLINK_MAGIC + target;\n await this.promises.writeFile(filePath, content);\n },\n\n readlink: async (filePath: string): Promise<string> => {\n const content = await this.promises.readFile(filePath, { encoding: 'utf8' }) as string;\n if (!content.startsWith(OPFSFileSystem.SYMLINK_MAGIC)) {\n throw new FSError('EINVAL', -22, `EINVAL: invalid argument, readlink '${filePath}'`, 'readlink', filePath);\n }\n return content.slice(OPFSFileSystem.SYMLINK_MAGIC.length);\n },\n\n link: async (existingPath: string, newPath: string) => {\n // Emulate hard link by copying the file\n await this.promises.copyFile(existingPath, newPath);\n },\n\n open: async (filePath: string, flags: string | number = 'r', _mode?: number): Promise<FileHandle> => {\n // Use async existence check instead of sync to work in main thread\n const flagNum = typeof flags === 'string' ? this.parseFlags(flags) : flags;\n const isReadOnly = (flagNum & constants.O_WRONLY) === 0 && (flagNum & constants.O_RDWR) === 0;\n\n if (isReadOnly) {\n const exists = await this.promises.exists(filePath);\n if (!exists) {\n throw createENOENT('open', filePath);\n }\n }\n\n const fd = this.nextFd++;\n this.fdTable.set(fd, {\n path: path.normalize(path.resolve(filePath)),\n flags: flagNum,\n position: 0,\n });\n return this.createFileHandle(fd, filePath);\n },\n\n opendir: async (dirPath: string): Promise<Dir> => {\n return this.createDir(dirPath);\n },\n\n mkdtemp: async (prefix: string): Promise<string> => {\n const suffix = Math.random().toString(36).substring(2, 8);\n const tmpDir = `${prefix}${suffix}`;\n await this.promises.mkdir(tmpDir, { recursive: true });\n return tmpDir;\n },\n\n watch: (filePath: string, options?: WatchOptions): AsyncIterable<WatchEventType> => {\n return this.createAsyncWatcher(filePath, options);\n },\n\n /**\n * Flush all pending writes to storage.\n * Use after writes with { flush: false } to ensure data is persisted.\n */\n flush: async () => {\n await this.fastCall('flush', '/');\n },\n\n /**\n * Purge all kernel caches.\n * Use between major operations to ensure clean state.\n */\n purge: async () => {\n await this.fastCall('purge', '/');\n this.statCache.clear();\n },\n };\n\n /**\n * Async flush - use after promises.writeFile with { flush: false }\n */\n async flush(): Promise<void> {\n await this.fastCall('flush', '/');\n }\n\n /**\n * Async purge - clears all kernel caches\n */\n async purge(): Promise<void> {\n await this.fastCall('purge', '/');\n this.statCache.clear();\n }\n\n // Constants\n constants = constants;\n\n // --- FileHandle Implementation ---\n\n private createFileHandle(fd: number, filePath: string): FileHandle {\n const self = this;\n const absPath = path.normalize(path.resolve(filePath));\n\n return {\n fd,\n\n async read(buffer: Uint8Array, offset = 0, length?: number, position: number | null = null): Promise<{ bytesRead: number; buffer: Uint8Array }> {\n const len = length ?? buffer.length - offset;\n const entry = self.fdTable.get(fd);\n if (!entry) throw new FSError('EBADF', -9, `bad file descriptor: ${fd}`);\n\n const readPos = position !== null ? position : entry.position;\n const result = await self.fastCall('read', absPath, { offset: readPos, len });\n\n if (!result.data) {\n return { bytesRead: 0, buffer };\n }\n\n const bytesRead = Math.min(result.data.length, len);\n buffer.set(result.data.subarray(0, bytesRead), offset);\n\n if (position === null) {\n entry.position += bytesRead;\n }\n\n return { bytesRead, buffer };\n },\n\n async write(buffer: Uint8Array, offset = 0, length?: number, position: number | null = null): Promise<{ bytesWritten: number; buffer: Uint8Array }> {\n const len = length ?? buffer.length - offset;\n const entry = self.fdTable.get(fd);\n if (!entry) throw new FSError('EBADF', -9, `bad file descriptor: ${fd}`);\n\n const writePos = position !== null ? position : entry.position;\n const data = buffer.subarray(offset, offset + len);\n\n await self.fastCall('write', absPath, { data, offset: writePos, truncate: false });\n self.invalidateStat(absPath);\n\n if (position === null) {\n entry.position += len;\n }\n\n return { bytesWritten: len, buffer };\n },\n\n async readFile(options?: ReadOptions | Encoding | null): Promise<Uint8Array | string> {\n return self.promises.readFile(absPath, options);\n },\n\n async writeFile(data: Uint8Array | string, options?: WriteOptions | Encoding): Promise<void> {\n return self.promises.writeFile(absPath, data, options);\n },\n\n async truncate(len = 0): Promise<void> {\n await self.fastCall('truncate', absPath, { len });\n self.invalidateStat(absPath);\n },\n\n async stat(): Promise<Stats> {\n return self.promises.stat(absPath);\n },\n\n async sync(): Promise<void> {\n await self.fastCall('flush', '/');\n },\n\n async datasync(): Promise<void> {\n await self.fastCall('flush', '/');\n },\n\n async close(): Promise<void> {\n self.fdTable.delete(fd);\n },\n };\n }\n\n // --- Dir Implementation ---\n\n private createDir(dirPath: string): Dir {\n const self = this;\n const absPath = path.normalize(path.resolve(dirPath));\n let entries: string[] | null = null;\n let index = 0;\n let closed = false;\n\n const loadEntries = async () => {\n if (entries === null) {\n const result = await self.fastCall('readdir', absPath);\n entries = result.entries || [];\n }\n };\n\n const dir: Dir = {\n path: absPath,\n\n async read(): Promise<Dirent | null> {\n if (closed) throw new FSError('EBADF', -9, 'Directory handle was closed');\n await loadEntries();\n if (index >= entries!.length) return null;\n\n const name = entries![index++];\n try {\n const stat = await self.fastCall('stat', path.join(absPath, name));\n const isDir = stat.type === 'directory' || stat.isDirectory === true;\n return createDirent(name, isDir);\n } catch {\n return createDirent(name, false);\n }\n },\n\n async close(): Promise<void> {\n closed = true;\n entries = null;\n },\n\n [Symbol.asyncIterator](): AsyncIterableIterator<Dirent> {\n const iterator: AsyncIterableIterator<Dirent> = {\n next: async (): Promise<IteratorResult<Dirent>> => {\n const dirent = await dir.read();\n if (dirent === null) {\n return { done: true, value: undefined };\n }\n return { done: false, value: dirent };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n return iterator;\n },\n };\n\n return dir;\n }\n\n // --- Watch Implementation (Native FileSystemObserver with polling fallback) ---\n\n private watchedFiles = new Map<string, { interval?: ReturnType<typeof setInterval>; observer?: FileSystemObserverInterface; listeners: Set<WatchFileListener>; lastStat: Stats | null }>();\n\n // Check if native FileSystemObserver is available\n private static readonly hasNativeObserver = typeof globalThis.FileSystemObserver !== 'undefined';\n\n // Get OPFS directory handle for a path\n private async getDirectoryHandle(dirPath: string, create = false): Promise<FileSystemDirectoryHandle> {\n const parts = dirPath.split('/').filter(Boolean);\n let current = await navigator.storage.getDirectory();\n for (const part of parts) {\n current = await current.getDirectoryHandle(part, { create });\n }\n return current;\n }\n\n // Get OPFS file handle for a path\n private async getFileHandle(filePath: string, create = false): Promise<FileSystemFileHandle> {\n const parts = filePath.split('/').filter(Boolean);\n const fileName = parts.pop();\n if (!fileName) throw new Error('Invalid file path');\n\n let current = await navigator.storage.getDirectory();\n for (const part of parts) {\n current = await current.getDirectoryHandle(part, { create });\n }\n return current.getFileHandle(fileName, { create });\n }\n\n // Convert FileSystemObserver change type to Node.js event type\n private mapChangeType(type: FileSystemChangeRecord['type']): 'rename' | 'change' {\n switch (type) {\n case 'appeared':\n case 'disappeared':\n case 'moved':\n return 'rename';\n case 'modified':\n return 'change';\n default:\n return 'change';\n }\n }\n\n private createAsyncWatcher(filePath: string, options?: WatchOptions): AsyncIterable<WatchEventType> {\n const absPath = path.normalize(path.resolve(filePath));\n\n // Use native FileSystemObserver if available\n if (OPFSFileSystem.hasNativeObserver) {\n return this.createNativeAsyncWatcher(absPath, options);\n }\n\n // Fallback to polling\n return this.createPollingAsyncWatcher(absPath, options);\n }\n\n private createNativeAsyncWatcher(absPath: string, options?: WatchOptions): AsyncIterable<WatchEventType> {\n const self = this;\n\n return {\n [Symbol.asyncIterator](): AsyncIterableIterator<WatchEventType> {\n const eventQueue: WatchEventType[] = [];\n let resolveNext: ((value: IteratorResult<WatchEventType>) => void) | null = null;\n let observer: FileSystemObserverInterface | null = null;\n let aborted = false;\n let initialized = false;\n\n // Handle abort signal\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n aborted = true;\n observer?.disconnect();\n if (resolveNext) {\n resolveNext({ done: true, value: undefined });\n resolveNext = null;\n }\n });\n }\n\n const callback: FileSystemObserverCallback = (records) => {\n for (const record of records) {\n if (record.type === 'errored' || record.type === 'unknown') continue;\n\n const filename = record.relativePathComponents.length > 0\n ? record.relativePathComponents[record.relativePathComponents.length - 1]\n : path.basename(absPath);\n\n const event: WatchEventType = {\n eventType: self.mapChangeType(record.type),\n filename,\n };\n\n if (resolveNext) {\n resolveNext({ done: false, value: event });\n resolveNext = null;\n } else {\n eventQueue.push(event);\n }\n }\n };\n\n const init = async () => {\n if (initialized) return;\n initialized = true;\n\n try {\n observer = new globalThis.FileSystemObserver!(callback);\n const stat = await self.promises.stat(absPath);\n const handle = stat.isDirectory()\n ? await self.getDirectoryHandle(absPath)\n : await self.getFileHandle(absPath);\n await observer.observe(handle, { recursive: options?.recursive });\n } catch (e) {\n // If native observer fails, we should return done\n aborted = true;\n }\n };\n\n const iterator: AsyncIterableIterator<WatchEventType> = {\n async next(): Promise<IteratorResult<WatchEventType>> {\n if (aborted) {\n return { done: true, value: undefined };\n }\n\n await init();\n\n if (aborted) {\n return { done: true, value: undefined };\n }\n\n // Return queued event if available\n if (eventQueue.length > 0) {\n return { done: false, value: eventQueue.shift()! };\n }\n\n // Wait for next event\n return new Promise(resolve => {\n resolveNext = resolve;\n });\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n return iterator;\n },\n };\n }\n\n private createPollingAsyncWatcher(absPath: string, options?: WatchOptions): AsyncIterable<WatchEventType> {\n const self = this;\n const interval = 1000;\n\n return {\n [Symbol.asyncIterator](): AsyncIterableIterator<WatchEventType> {\n let lastMtimeMs: number | null = null;\n let lastEntries: Set<string> | null = null;\n let aborted = false;\n let pollTimeout: ReturnType<typeof setTimeout> | null = null;\n\n if (options?.signal) {\n options.signal.addEventListener('abort', () => {\n aborted = true;\n if (pollTimeout) clearTimeout(pollTimeout);\n });\n }\n\n const checkForChanges = async (): Promise<WatchEventType | null> => {\n if (aborted) return null;\n\n try {\n const stat = await self.promises.stat(absPath);\n\n if (stat.isDirectory()) {\n const entries = await self.promises.readdir(absPath) as string[];\n const currentEntries = new Set(entries);\n\n if (lastEntries === null) {\n lastEntries = currentEntries;\n return null;\n }\n\n for (const entry of currentEntries) {\n if (!lastEntries.has(entry)) {\n lastEntries = currentEntries;\n return { eventType: 'rename', filename: entry };\n }\n }\n\n for (const entry of lastEntries) {\n if (!currentEntries.has(entry)) {\n lastEntries = currentEntries;\n return { eventType: 'rename', filename: entry };\n }\n }\n\n lastEntries = currentEntries;\n } else {\n if (lastMtimeMs === null) {\n lastMtimeMs = stat.mtimeMs;\n return null;\n }\n\n if (stat.mtimeMs !== lastMtimeMs) {\n lastMtimeMs = stat.mtimeMs;\n return { eventType: 'change', filename: path.basename(absPath) };\n }\n }\n } catch {\n if (lastMtimeMs !== null || lastEntries !== null) {\n lastMtimeMs = null;\n lastEntries = null;\n return { eventType: 'rename', filename: path.basename(absPath) };\n }\n }\n\n return null;\n };\n\n const iterator: AsyncIterableIterator<WatchEventType> = {\n async next(): Promise<IteratorResult<WatchEventType>> {\n if (aborted) {\n return { done: true, value: undefined };\n }\n\n while (!aborted) {\n const event = await checkForChanges();\n if (event) {\n return { done: false, value: event };\n }\n\n await new Promise<void>(resolve => {\n pollTimeout = setTimeout(resolve, interval);\n });\n }\n\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n return iterator;\n },\n };\n }\n\n /**\n * Watch a file or directory for changes.\n * Uses native FileSystemObserver when available, falls back to polling.\n */\n watch(filePath: string, options: WatchOptions | WatchListener = {}, listener?: WatchListener): FSWatcher {\n const absPath = path.normalize(path.resolve(filePath));\n const opts = typeof options === 'function' ? {} : options;\n const cb = typeof options === 'function' ? options : listener;\n\n // Use native FileSystemObserver if available\n if (OPFSFileSystem.hasNativeObserver) {\n return this.createNativeWatcher(absPath, opts, cb);\n }\n\n // Fallback to polling\n return this.createPollingWatcher(absPath, cb);\n }\n\n private createNativeWatcher(absPath: string, opts: WatchOptions, cb?: WatchListener): FSWatcher {\n const self = this;\n let observer: FileSystemObserverInterface | null = null;\n let closed = false;\n\n const callback: FileSystemObserverCallback = (records) => {\n if (closed) return;\n\n for (const record of records) {\n if (record.type === 'errored' || record.type === 'unknown') continue;\n\n const filename = record.relativePathComponents.length > 0\n ? record.relativePathComponents[record.relativePathComponents.length - 1]\n : path.basename(absPath);\n\n cb?.(self.mapChangeType(record.type), filename);\n }\n };\n\n // Initialize observer asynchronously\n (async () => {\n if (closed) return;\n try {\n observer = new globalThis.FileSystemObserver!(callback);\n const stat = await self.promises.stat(absPath);\n const handle = stat.isDirectory()\n ? await self.getDirectoryHandle(absPath)\n : await self.getFileHandle(absPath);\n await observer.observe(handle, { recursive: opts.recursive });\n } catch {\n // Silently fail - watcher will just not work\n }\n })();\n\n const watcher: FSWatcher = {\n close: () => {\n closed = true;\n observer?.disconnect();\n },\n ref: () => watcher,\n unref: () => watcher,\n };\n\n return watcher;\n }\n\n private createPollingWatcher(absPath: string, cb?: WatchListener): FSWatcher {\n const interval = 1000;\n let lastMtimeMs: number | null = null;\n let lastEntries: Set<string> | null = null;\n let closed = false;\n\n const poll = async () => {\n if (closed) return;\n\n try {\n const stat = await this.promises.stat(absPath);\n\n if (stat.isDirectory()) {\n const entries = await this.promises.readdir(absPath) as string[];\n const currentEntries = new Set(entries);\n\n if (lastEntries !== null) {\n for (const entry of currentEntries) {\n if (!lastEntries.has(entry)) {\n cb?.('rename', entry);\n }\n }\n for (const entry of lastEntries) {\n if (!currentEntries.has(entry)) {\n cb?.('rename', entry);\n }\n }\n }\n lastEntries = currentEntries;\n } else {\n if (lastMtimeMs !== null && stat.mtimeMs !== lastMtimeMs) {\n cb?.('change', path.basename(absPath));\n }\n lastMtimeMs = stat.mtimeMs;\n }\n } catch {\n if (lastMtimeMs !== null || lastEntries !== null) {\n cb?.('rename', path.basename(absPath));\n lastMtimeMs = null;\n lastEntries = null;\n }\n }\n };\n\n const intervalId = setInterval(poll, interval);\n poll();\n\n const watcher: FSWatcher = {\n close: () => {\n closed = true;\n clearInterval(intervalId);\n },\n ref: () => watcher,\n unref: () => watcher,\n };\n\n return watcher;\n }\n\n /**\n * Watch a file for changes using native FileSystemObserver or stat polling.\n */\n watchFile(filePath: string, options: WatchFileOptions | WatchFileListener = {}, listener?: WatchFileListener): StatWatcher {\n const absPath = path.normalize(path.resolve(filePath));\n const opts = typeof options === 'function' ? {} : options;\n const cb = typeof options === 'function' ? options : listener;\n const interval = opts.interval ?? 5007;\n\n let lastStat: Stats | null = null;\n let closed = false;\n let observer: FileSystemObserverInterface | undefined;\n\n // Polling function used as fallback or primary\n const poll = async () => {\n if (closed) return;\n\n try {\n const stat = await this.promises.stat(absPath);\n if (lastStat !== null) {\n if (stat.mtimeMs !== lastStat.mtimeMs || stat.size !== lastStat.size) {\n cb?.(stat, lastStat);\n }\n }\n lastStat = stat;\n } catch {\n const emptyStat = createStats({ type: 'file', size: 0, mtimeMs: 0, mode: 0 });\n if (lastStat !== null) {\n cb?.(emptyStat, lastStat);\n }\n lastStat = emptyStat;\n }\n };\n\n // Try native observer first, fall back to polling\n if (OPFSFileSystem.hasNativeObserver && cb) {\n const self = this;\n\n const observerCallback: FileSystemObserverCallback = async () => {\n if (closed) return;\n try {\n const stat = await self.promises.stat(absPath);\n if (lastStat !== null && (stat.mtimeMs !== lastStat.mtimeMs || stat.size !== lastStat.size)) {\n cb(stat, lastStat);\n }\n lastStat = stat;\n } catch {\n const emptyStat = createStats({ type: 'file', size: 0, mtimeMs: 0, mode: 0 });\n if (lastStat !== null) {\n cb(emptyStat, lastStat);\n }\n lastStat = emptyStat;\n }\n };\n\n (async () => {\n if (closed) return;\n try {\n // Get initial stat\n lastStat = await self.promises.stat(absPath);\n\n observer = new globalThis.FileSystemObserver!(observerCallback);\n const handle = await self.getFileHandle(absPath);\n await observer.observe(handle);\n } catch {\n // Native observer failed, fall back to polling\n if (!closed && !this.watchedFiles.get(absPath)?.interval) {\n const entry = this.watchedFiles.get(absPath);\n if (entry) {\n entry.interval = setInterval(poll, interval);\n }\n }\n }\n })();\n\n if (!this.watchedFiles.has(absPath)) {\n this.watchedFiles.set(absPath, {\n observer,\n listeners: new Set(),\n lastStat: null,\n });\n }\n this.watchedFiles.get(absPath)!.listeners.add(cb);\n } else {\n // Polling fallback (no native observer available)\n if (!this.watchedFiles.has(absPath)) {\n this.watchedFiles.set(absPath, {\n interval: setInterval(poll, interval),\n listeners: new Set(),\n lastStat: null,\n });\n }\n if (cb) this.watchedFiles.get(absPath)!.listeners.add(cb);\n\n poll();\n }\n\n const watcher: StatWatcher = {\n ref: () => watcher,\n unref: () => watcher,\n };\n\n return watcher;\n }\n\n /**\n * Stop watching a file.\n */\n unwatchFile(filePath: string, listener?: WatchFileListener): void {\n const absPath = path.normalize(path.resolve(filePath));\n const entry = this.watchedFiles.get(absPath);\n\n if (entry) {\n if (listener) {\n entry.listeners.delete(listener);\n if (entry.listeners.size === 0) {\n if (entry.interval) clearInterval(entry.interval);\n if (entry.observer) entry.observer.disconnect();\n this.watchedFiles.delete(absPath);\n }\n } else {\n if (entry.interval) clearInterval(entry.interval);\n if (entry.observer) entry.observer.disconnect();\n this.watchedFiles.delete(absPath);\n }\n }\n }\n\n // --- Stream Implementation ---\n\n /**\n * Create a readable stream for a file.\n */\n createReadStream(filePath: string, options?: ReadStreamOptions | string): ReadableStream<Uint8Array> {\n const opts = typeof options === 'string' ? { encoding: options as Encoding } : options ?? {};\n const absPath = path.normalize(path.resolve(filePath));\n const start = opts.start ?? 0;\n const end = opts.end;\n const highWaterMark = opts.highWaterMark ?? 64 * 1024;\n\n let position = start;\n let closed = false;\n const self = this;\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n if (closed) {\n controller.close();\n return;\n }\n\n try {\n const maxRead = end !== undefined ? Math.min(highWaterMark, end - position + 1) : highWaterMark;\n if (maxRead <= 0) {\n controller.close();\n closed = true;\n return;\n }\n\n const result = await self.fastCall('read', absPath, { offset: position, len: maxRead });\n\n if (!result.data || result.data.length === 0) {\n controller.close();\n closed = true;\n return;\n }\n\n controller.enqueue(result.data);\n position += result.data.length;\n\n if (end !== undefined && position > end) {\n controller.close();\n closed = true;\n }\n } catch (e) {\n controller.error(e);\n closed = true;\n }\n },\n\n cancel() {\n closed = true;\n },\n });\n }\n\n /**\n * Create a writable stream for a file.\n */\n createWriteStream(filePath: string, options?: WriteStreamOptions | string): WritableStream<Uint8Array> {\n const opts = typeof options === 'string' ? { encoding: options as Encoding } : options ?? {};\n const absPath = path.normalize(path.resolve(filePath));\n const start = opts.start ?? 0;\n const shouldFlush = opts.flush !== false;\n\n let position = start;\n let initialized = false;\n const self = this;\n\n return new WritableStream<Uint8Array>({\n async write(chunk) {\n // Truncate on first write if starting from beginning\n if (!initialized && start === 0) {\n await self.fastCall('write', absPath, { data: chunk, offset: 0, flush: false });\n position = chunk.length;\n initialized = true;\n } else {\n await self.fastCall('write', absPath, { data: chunk, offset: position, truncate: false, flush: false });\n position += chunk.length;\n initialized = true;\n }\n self.invalidateStat(absPath);\n },\n\n async close() {\n if (shouldFlush) {\n await self.fastCall('flush', '/');\n }\n },\n\n async abort() {\n // Nothing to clean up\n },\n });\n }\n\n // --- Sync methods for opendir and mkdtemp ---\n\n /**\n * Open a directory for iteration (sync).\n */\n opendirSync(dirPath: string): Dir {\n return this.createDir(dirPath);\n }\n\n /**\n * Create a unique temporary directory (sync).\n */\n mkdtempSync(prefix: string): string {\n const suffix = Math.random().toString(36).substring(2, 8);\n const tmpDir = `${prefix}${suffix}`;\n this.mkdirSync(tmpDir, { recursive: true });\n return tmpDir;\n }\n}\n","/**\n * OPFS-FS: Battle-tested OPFS-based Node.js fs polyfill\n *\n * Provides a Node.js-compatible filesystem API that works in browsers using OPFS.\n *\n * Features:\n * - Synchronous API: fs.readFileSync, fs.writeFileSync, etc. (requires crossOriginIsolated)\n * - Async Promises API: fs.promises.readFile, fs.promises.writeFile, etc.\n * - Cross-tab safety via navigator.locks\n *\n * Performance Tiers:\n * - Tier 1 (Sync): SharedArrayBuffer + Atomics - requires crossOriginIsolated (COOP/COEP headers)\n * - Tier 2 (Async): Promises API - always available\n *\n * @example\n * ```typescript\n * import { fs } from '@componentor/fs';\n *\n * // Sync API (requires crossOriginIsolated)\n * fs.writeFileSync('/hello.txt', 'Hello World!');\n * const data = fs.readFileSync('/hello.txt', 'utf8');\n *\n * // Async API (always available)\n * await fs.promises.writeFile('/async.txt', 'Async data');\n * const content = await fs.promises.readFile('/async.txt', 'utf8');\n * ```\n */\n\nexport { OPFSFileSystem } from './filesystem.js';\nexport { constants } from './constants.js';\nexport { FSError, createENOENT, createEEXIST, createEISDIR, createENOTDIR, createENOTEMPTY, createEACCES, createEINVAL, mapErrorCode } from './errors.js';\nexport * as path from './path.js';\nexport type {\n Stats,\n Dirent,\n ReadOptions,\n WriteOptions,\n MkdirOptions,\n RmdirOptions,\n RmOptions,\n ReaddirOptions,\n Encoding,\n FileSystemPromises,\n PathLike,\n} from './types.js';\n\nimport { OPFSFileSystem } from './filesystem.js';\n\n// Default singleton instance\nexport const fs = new OPFSFileSystem();\n\n// Default export for convenience\nexport default fs;\n"]}
|