@tinycloud/vfs 0.1.15-beta.7 → 0.2.0-beta.9

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/dist/index.cjs CHANGED
@@ -58,6 +58,7 @@ var ERRNO = {
58
58
  EISDIR: -21,
59
59
  EINVAL: -22,
60
60
  ENOTEMPTY: -39,
61
+ ENOSPC: -28,
61
62
  EROFS: -30
62
63
  };
63
64
  function createNodeError(code, message, syscall, path) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/TinyCloudVfsProvider.ts","../src/bridge.ts","../src/errors.ts","../src/fsPatch.ts","../src/pathing.ts","../src/metadata.ts"],"sourcesContent":["export {\n TinyCloudVfsProvider,\n createTinyCloudVfs,\n createTinyCloudVfsFromNode,\n createTinyCloudDelegatedVfs,\n} from \"./TinyCloudVfsProvider\";\n\nexport type {\n TinyCloudVfsMetadata,\n TinyCloudVfsOptions,\n TinyCloudVfsProviderOptions,\n TinyCloudVfsSessionData,\n TinyCloudVfsSource,\n CreateTinyCloudDelegatedVfsOptions,\n CreateTinyCloudNodeVfsOptions,\n} from \"./types\";\n","import { Buffer } from \"node:buffer\";\nimport { VirtualProvider, create } from \"@platformatic/vfs\";\nimport type { VirtualFileSystem } from \"@platformatic/vfs\";\nimport { TinyCloudVfsBridge } from \"./bridge\";\nimport {\n createEISDIR,\n createEROFS,\n fromWorkerError,\n} from \"./errors\";\nimport { wrapVfsWithFsWritePatches } from \"./fsPatch\";\nimport { normalizeMode } from \"./metadata\";\nimport { normalizeVfsPath } from \"./pathing\";\nimport type {\n CreateTinyCloudDelegatedVfsOptions,\n CreateTinyCloudNodeVfsOptions,\n TinyCloudVfsDirent,\n TinyCloudVfsMetadata,\n TinyCloudVfsOptions,\n TinyCloudVfsProviderOptions,\n TinyCloudVfsSource,\n TinyCloudVfsHandleState,\n TinyCloudNodeLike,\n WorkerResponse,\n} from \"./types\";\n\nconst S_IFREG = 0o100000;\nconst S_IFDIR = 0o040000;\nconst DEFAULT_BLOCK_SIZE = 4096;\n\nfunction createStats(metadata: TinyCloudVfsMetadata) {\n const mode = metadata.kind === \"directory\"\n ? (metadata.mode | S_IFDIR)\n : (metadata.mode | S_IFREG);\n\n return {\n dev: 0,\n mode,\n nlink: 1,\n uid: process.getuid?.() ?? 0,\n gid: process.getgid?.() ?? 0,\n rdev: 0,\n blksize: DEFAULT_BLOCK_SIZE,\n ino: 0,\n size: metadata.kind === \"directory\" ? DEFAULT_BLOCK_SIZE : metadata.size,\n blocks: metadata.kind === \"directory\" ? 8 : Math.ceil(metadata.size / 512),\n atimeMs: metadata.mtimeMs,\n mtimeMs: metadata.mtimeMs,\n ctimeMs: metadata.ctimeMs,\n birthtimeMs: metadata.birthtimeMs,\n atime: new Date(metadata.mtimeMs),\n mtime: new Date(metadata.mtimeMs),\n ctime: new Date(metadata.ctimeMs),\n birthtime: new Date(metadata.birthtimeMs),\n isFile: () => metadata.kind === \"file\",\n isDirectory: () => metadata.kind === \"directory\",\n isSymbolicLink: () => false,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction createDirent(entry: TinyCloudVfsDirent) {\n return {\n name: entry.name,\n parentPath: entry.parentPath,\n path: entry.parentPath,\n isFile: () => entry.kind === \"file\",\n isDirectory: () => entry.kind === \"directory\",\n isSymbolicLink: () => false,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction expectStatResult(response: WorkerResponse): TinyCloudVfsMetadata {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"metadata\" in response.result)) {\n throw new Error(\"worker returned an unexpected stat payload\");\n }\n return response.result.metadata;\n}\n\nfunction expectReadFileResult(response: WorkerResponse): { metadata: TinyCloudVfsMetadata; content: Uint8Array } {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"metadata\" in response.result) || !(\"content\" in response.result)) {\n throw new Error(\"worker returned an unexpected readFile payload\");\n }\n return response.result;\n}\n\nfunction expectReaddirResult(response: WorkerResponse): TinyCloudVfsDirent[] {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"entries\" in response.result)) {\n throw new Error(\"worker returned an unexpected readdir payload\");\n }\n return response.result.entries;\n}\n\nfunction isWriteFlag(flags = \"r\"): boolean {\n return /[wa+]/.test(flags);\n}\n\nfunction isAppendFlag(flags = \"r\"): boolean {\n return flags.startsWith(\"a\");\n}\n\nfunction isTruncateFlag(flags = \"r\"): boolean {\n return flags.startsWith(\"w\");\n}\n\nclass TinyCloudVfsFileHandle {\n private readonly bridge: TinyCloudVfsBridge;\n private readonly state: TinyCloudVfsHandleState;\n private closed = false;\n private dirty = false;\n private position = 0;\n\n constructor(bridge: TinyCloudVfsBridge, state: TinyCloudVfsHandleState) {\n this.bridge = bridge;\n this.state = state;\n\n if (isAppendFlag(state.flags)) {\n this.position = state.content.length;\n }\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new Error(\"file handle is closed\");\n }\n }\n\n private commit(): void {\n if (!this.dirty) {\n return;\n }\n\n const response = this.bridge.requestSync({\n type: \"writeFile\",\n path: this.state.path,\n content: this.state.content,\n mode: this.state.mode,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n this.dirty = false;\n }\n\n readSync(buffer: Buffer, offset: number, length: number, position: number | null): number {\n this.ensureOpen();\n const readFrom = position ?? this.position;\n const available = Math.max(0, this.state.content.length - readFrom);\n const bytesToRead = Math.min(length, available);\n if (bytesToRead === 0) {\n return 0;\n }\n\n this.state.content.copy(buffer, offset, readFrom, readFrom + bytesToRead);\n if (position === null || position === undefined) {\n this.position = readFrom + bytesToRead;\n }\n return bytesToRead;\n }\n\n writeSync(buffer: Buffer, offset: number, length: number, position: number | null): number {\n this.ensureOpen();\n const writeFrom = position ?? this.position;\n const data = buffer.subarray(offset, offset + length);\n const requiredLength = writeFrom + data.length;\n\n if (requiredLength > this.state.content.length) {\n const next = Buffer.alloc(requiredLength);\n this.state.content.copy(next, 0, 0, this.state.content.length);\n this.state.content = next;\n }\n\n data.copy(this.state.content, writeFrom);\n this.state.metadata = {\n ...this.state.metadata,\n size: this.state.content.length,\n mtimeMs: Date.now(),\n ctimeMs: Date.now(),\n };\n this.dirty = true;\n\n if (position === null || position === undefined) {\n this.position = writeFrom + data.length;\n }\n\n return data.length;\n }\n\n readFileSync(options?: BufferEncoding | { encoding?: BufferEncoding | null } | null): Buffer | string {\n this.ensureOpen();\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n if (encoding) {\n return this.state.content.toString(encoding);\n }\n return Buffer.from(this.state.content);\n }\n\n writeFileSync(data: string | Buffer, options?: BufferEncoding | { encoding?: BufferEncoding; mode?: number }): void {\n this.ensureOpen();\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n const buffer = typeof data === \"string\" ? Buffer.from(data, encoding) : Buffer.from(data);\n\n if (isAppendFlag(this.state.flags)) {\n this.state.content = Buffer.concat([this.state.content, buffer]);\n } else {\n this.state.content = Buffer.from(buffer);\n }\n\n this.state.metadata = {\n ...this.state.metadata,\n size: this.state.content.length,\n mtimeMs: Date.now(),\n ctimeMs: Date.now(),\n mode: normalizeMode(\"file\", typeof options === \"object\" ? options?.mode : this.state.mode),\n };\n this.dirty = true;\n this.position = this.state.content.length;\n }\n\n statSync() {\n this.ensureOpen();\n return createStats({\n ...this.state.metadata,\n size: this.state.content.length,\n });\n }\n\n closeSync(): void {\n this.ensureOpen();\n this.commit();\n this.closed = true;\n }\n}\n\nexport class TinyCloudVfsProvider extends VirtualProvider {\n private readonly bridge: TinyCloudVfsBridge;\n private readonly forceReadOnly: boolean;\n\n constructor(options: TinyCloudVfsProviderOptions) {\n super();\n this.forceReadOnly = options.readOnly === true;\n this.bridge = new TinyCloudVfsBridge({\n source: options.source,\n mountPrefix: options.mountPrefix ?? \"\",\n });\n }\n\n get readonly(): boolean {\n return this.forceReadOnly;\n }\n\n close(): void {\n this.bridge.close();\n }\n\n private ensureWritable(path: string, syscall: string): void {\n if (this.forceReadOnly) {\n throw createEROFS(syscall, path);\n }\n }\n\n private normalize(path: string): string {\n return normalizeVfsPath(path);\n }\n\n openSync(path: string, flags = \"r\", mode?: number) {\n const normalized = this.normalize(path);\n const writable = isWriteFlag(flags);\n\n if (writable) {\n this.ensureWritable(normalized, \"open\");\n }\n\n let metadata: TinyCloudVfsMetadata;\n let content = Buffer.alloc(0);\n\n try {\n const response = expectReadFileResult(this.bridge.requestSync({ type: \"readFile\", path: normalized }));\n metadata = response.metadata;\n content = Buffer.from(response.content);\n if (isTruncateFlag(flags)) {\n content = Buffer.alloc(0);\n metadata = {\n ...metadata,\n size: 0,\n mode: normalizeMode(\"file\", mode ?? metadata.mode),\n };\n }\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code !== \"ENOENT\" || !writable) {\n throw error;\n }\n\n metadata = {\n kind: \"file\",\n size: 0,\n mode: normalizeMode(\"file\", mode),\n ctimeMs: Date.now(),\n mtimeMs: Date.now(),\n birthtimeMs: Date.now(),\n };\n }\n\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"open\", normalized);\n }\n\n return new TinyCloudVfsFileHandle(this.bridge, {\n path: normalized,\n flags,\n mode: normalizeMode(\"file\", mode ?? metadata.mode),\n content,\n metadata,\n });\n }\n\n async open(path: string, flags = \"r\", mode?: number) {\n return this.openSync(path, flags, mode);\n }\n\n statSync(path: string) {\n const normalized = this.normalize(path);\n return createStats(expectStatResult(this.bridge.requestSync({ type: \"stat\", path: normalized })));\n }\n\n async stat(path: string) {\n return this.statSync(path);\n }\n\n lstatSync(path: string) {\n return this.statSync(path);\n }\n\n async lstat(path: string) {\n return this.lstatSync(path);\n }\n\n readdirSync(path: string, options?: { withFileTypes?: boolean }) {\n const normalized = this.normalize(path);\n const entries = expectReaddirResult(this.bridge.requestSync({ type: \"readdir\", path: normalized }));\n\n if (options?.withFileTypes) {\n return entries.map(createDirent);\n }\n\n return entries.map((entry: TinyCloudVfsDirent) => entry.name);\n }\n\n async readdir(path: string, options?: { withFileTypes?: boolean }) {\n return this.readdirSync(path, options);\n }\n\n mkdirSync(path: string, options?: { recursive?: boolean; mode?: number }) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"mkdir\");\n const response = this.bridge.requestSync({\n type: \"mkdir\",\n path: normalized,\n recursive: options?.recursive === true,\n mode: options?.mode,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n return options?.recursive ? normalized : undefined;\n }\n\n async mkdir(path: string, options?: { recursive?: boolean; mode?: number }) {\n return this.mkdirSync(path, options);\n }\n\n rmdirSync(path: string) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"rmdir\");\n const response = this.bridge.requestSync({ type: \"rmdir\", path: normalized });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async rmdir(path: string) {\n this.rmdirSync(path);\n }\n\n unlinkSync(path: string) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"unlink\");\n const response = this.bridge.requestSync({ type: \"unlink\", path: normalized });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async unlink(path: string) {\n this.unlinkSync(path);\n }\n\n renameSync(oldPath: string, newPath: string) {\n const normalizedOld = this.normalize(oldPath);\n const normalizedNew = this.normalize(newPath);\n this.ensureWritable(normalizedOld, \"rename\");\n const response = this.bridge.requestSync({\n type: \"rename\",\n oldPath: normalizedOld,\n newPath: normalizedNew,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async rename(oldPath: string, newPath: string) {\n this.renameSync(oldPath, newPath);\n }\n}\n\nfunction toSessionSource(node: TinyCloudNodeLike, host?: string): TinyCloudVfsSource {\n if (!node.session) {\n throw new Error(\"TinyCloudNode has no active session; call signIn() or restoreSession() first.\");\n }\n\n const resolvedHost = host ?? node.config?.host ?? \"https://node.tinycloud.xyz\";\n\n return {\n kind: \"session\",\n host: resolvedHost,\n session: node.session,\n };\n}\n\nexport function createTinyCloudVfs(options: TinyCloudVfsProviderOptions & TinyCloudVfsOptions): { provider: TinyCloudVfsProvider; vfs: VirtualFileSystem } {\n const provider = new TinyCloudVfsProvider(options);\n const vfs = wrapVfsWithFsWritePatches(create(provider, {\n moduleHooks: options.moduleHooks,\n overlay: options.overlay,\n virtualCwd: options.virtualCwd,\n }));\n\n if (options.mountPoint) {\n vfs.mount(options.mountPoint);\n }\n\n return { provider, vfs };\n}\n\nexport function createTinyCloudVfsFromNode(node: TinyCloudNodeLike, options: CreateTinyCloudNodeVfsOptions = {}) {\n return createTinyCloudVfs({\n ...options,\n source: toSessionSource(node, options.host),\n });\n}\n\nexport async function createTinyCloudDelegatedVfs(options: CreateTinyCloudDelegatedVfsOptions) {\n if (!options.node.session) {\n throw new Error(\"TinyCloudNode has no active session; call signIn() or restoreSession() first.\");\n }\n if (typeof options.node.useDelegation !== \"function\") {\n throw new Error(\"TinyCloudNode does not expose useDelegation().\");\n }\n\n const access = await options.node.useDelegation(options.delegation);\n if (!access?.session) {\n throw new Error(\"Delegated access does not expose a resolved session snapshot.\");\n }\n\n return createTinyCloudVfs({\n ...options,\n source: {\n kind: \"resolved-delegation\",\n host: options.host ?? options.delegation.host ?? \"https://node.tinycloud.xyz\",\n session: access.session,\n kvPrefix: access.kv?.config?.prefix ?? \"\",\n },\n });\n}\n","import { MessageChannel, Worker, receiveMessageOnPort } from \"node:worker_threads\";\nimport { join } from \"node:path\";\nimport type { TinyCloudVfsWorkerInit, WorkerRequest, WorkerResponse } from \"./types\";\nimport { createEIO } from \"./errors\";\n\nconst WAIT_SLICE_MS = 1_000;\n\nfunction createWaitSignal(): { buffer: SharedArrayBuffer; view: Int32Array } {\n const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);\n return {\n buffer,\n view: new Int32Array(buffer),\n };\n}\n\nfunction resolveWorkerSpecifier(): string | URL {\n if (typeof __dirname !== \"undefined\") {\n return join(__dirname, \"worker.cjs\");\n }\n\n return new URL(\"./worker.js\", import.meta.url);\n}\n\nexport class TinyCloudVfsBridge {\n private readonly worker: Worker;\n\n constructor(init: TinyCloudVfsWorkerInit) {\n const specifier = resolveWorkerSpecifier();\n this.worker = typeof specifier === \"string\"\n ? new Worker(specifier)\n : new Worker(specifier);\n\n const response = this.requestSync({ type: \"init\", init });\n if (!response.ok) {\n this.worker.terminate();\n throw createEIO(\"init\", \"/\", response.error.message);\n }\n }\n\n close(): void {\n void this.worker.terminate();\n }\n\n requestSync(request: WorkerRequest): WorkerResponse {\n const { port1, port2 } = new MessageChannel();\n const { buffer, view } = createWaitSignal();\n\n this.worker.postMessage(\n {\n request,\n replyPort: port1,\n waitBuffer: buffer,\n },\n [port1],\n );\n\n while (Atomics.load(view, 0) === 0) {\n Atomics.wait(view, 0, 0, WAIT_SLICE_MS);\n }\n\n const response = receiveMessageOnPort(port2)?.message as WorkerResponse | undefined;\n port2.close();\n if (!response) {\n throw createEIO(\"bridge\", \"/\", \"worker did not return a response\");\n }\n\n return response;\n }\n\n async requestAsync(request: WorkerRequest): Promise<WorkerResponse> {\n return this.requestSync(request);\n }\n}\n","const ERRNO: Record<string, number> = {\n EPERM: -1,\n ENOENT: -2,\n EIO: -5,\n EBADF: -9,\n EACCES: -13,\n EBUSY: -16,\n EEXIST: -17,\n ENOTDIR: -20,\n EISDIR: -21,\n EINVAL: -22,\n ENOTEMPTY: -39,\n EROFS: -30,\n};\n\nexport function createNodeError(\n code: string,\n message: string,\n syscall: string,\n path?: string,\n): NodeJS.ErrnoException {\n const error = new Error(message) as NodeJS.ErrnoException;\n error.code = code;\n error.errno = ERRNO[code] ?? -1;\n error.syscall = syscall;\n if (path) {\n error.path = path;\n }\n return error;\n}\n\nexport function createENOENT(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOENT\", `no such file or directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEISDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EISDIR\", `illegal operation on a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTDIR\", `not a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTEMPTY\", `directory not empty, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEEXIST(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EEXIST\", `file already exists, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEACCES(syscall: string, path: string, message = \"permission denied\"): NodeJS.ErrnoException {\n return createNodeError(\"EACCES\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEROFS(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EROFS\", `read-only file system, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEIO(syscall: string, path: string, message: string): NodeJS.ErrnoException {\n return createNodeError(\"EIO\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEBUSY(syscall: string, path: string, message = \"resource busy or locked\"): NodeJS.ErrnoException {\n return createNodeError(\"EBUSY\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEINVAL(syscall: string, path: string, message = \"invalid argument\"): NodeJS.ErrnoException {\n return createNodeError(\"EINVAL\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function fromWorkerError(error: { code: string; message: string; syscall?: string; path?: string }): NodeJS.ErrnoException {\n return createNodeError(\n error.code,\n error.message,\n error.syscall ?? \"vfs\",\n error.path,\n );\n}\n","import { Buffer } from \"node:buffer\";\nimport fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport type * as NodeFs from \"node:fs\";\nimport type * as NodeFsPromises from \"node:fs/promises\";\nimport { syncBuiltinESMExports } from \"node:module\";\nimport type { VirtualFileSystem } from \"@platformatic/vfs\";\nimport { fileURLToPath } from \"node:url\";\nimport { createNodeError } from \"./errors\";\n\ntype PathArg = string | Buffer | URL;\ntype WriteCallback = (error: NodeJS.ErrnoException | null) => void;\ntype MkdirCallback = (error: NodeJS.ErrnoException | null, path?: string) => void;\n\ninterface PatchableVirtualFileSystem extends VirtualFileSystem {\n mountPoint: string | null;\n mounted: boolean;\n shouldHandle(path: string): boolean;\n writeFileSync(path: string, data: unknown, options?: unknown): void;\n appendFileSync(path: string, data: unknown, options?: unknown): void;\n mkdirSync(path: string, options?: unknown): string | undefined;\n renameSync(oldPath: string, newPath: string): void;\n unlinkSync(path: string): void;\n rmdirSync(path: string, options?: unknown): void;\n promises: {\n writeFile(path: string, data: unknown, options?: unknown): Promise<void>;\n appendFile(path: string, data: unknown, options?: unknown): Promise<void>;\n mkdir(path: string, options?: unknown): Promise<string | undefined>;\n rename(oldPath: string, newPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rmdir(path: string, options?: unknown): Promise<void>;\n };\n [Symbol.dispose]?: () => void;\n}\n\ninterface OriginalFsMethods {\n writeFileSync: typeof NodeFs.writeFileSync;\n appendFileSync: typeof NodeFs.appendFileSync;\n mkdirSync: typeof NodeFs.mkdirSync;\n renameSync: typeof NodeFs.renameSync;\n unlinkSync: typeof NodeFs.unlinkSync;\n rmdirSync: typeof NodeFs.rmdirSync;\n writeFile: typeof NodeFs.writeFile;\n appendFile: typeof NodeFs.appendFile;\n mkdir: typeof NodeFs.mkdir;\n rename: typeof NodeFs.rename;\n unlink: typeof NodeFs.unlink;\n rmdir: typeof NodeFs.rmdir;\n}\n\ninterface OriginalPromiseMethods {\n writeFile: typeof NodeFsPromises.writeFile;\n appendFile: typeof NodeFsPromises.appendFile;\n mkdir: typeof NodeFsPromises.mkdir;\n rename: typeof NodeFsPromises.rename;\n unlink: typeof NodeFsPromises.unlink;\n rmdir: typeof NodeFsPromises.rmdir;\n}\n\nconst activeVfs = new Set<PatchableVirtualFileSystem>();\nconst mutableFs = fs as typeof NodeFs & { promises: typeof NodeFsPromises };\nconst mutableFsPromises = fsPromises as typeof NodeFsPromises;\n\nconst originalFsMethods: OriginalFsMethods = {\n writeFileSync: mutableFs.writeFileSync.bind(mutableFs),\n appendFileSync: mutableFs.appendFileSync.bind(mutableFs),\n mkdirSync: mutableFs.mkdirSync.bind(mutableFs),\n renameSync: mutableFs.renameSync.bind(mutableFs),\n unlinkSync: mutableFs.unlinkSync.bind(mutableFs),\n rmdirSync: mutableFs.rmdirSync.bind(mutableFs),\n writeFile: mutableFs.writeFile.bind(mutableFs),\n appendFile: mutableFs.appendFile.bind(mutableFs),\n mkdir: mutableFs.mkdir.bind(mutableFs),\n rename: mutableFs.rename.bind(mutableFs),\n unlink: mutableFs.unlink.bind(mutableFs),\n rmdir: mutableFs.rmdir.bind(mutableFs),\n};\n\nconst originalPromiseMethods: OriginalPromiseMethods = {\n writeFile: mutableFsPromises.writeFile.bind(mutableFsPromises),\n appendFile: mutableFsPromises.appendFile.bind(mutableFsPromises),\n mkdir: mutableFsPromises.mkdir.bind(mutableFsPromises),\n rename: mutableFsPromises.rename.bind(mutableFsPromises),\n unlink: mutableFsPromises.unlink.bind(mutableFsPromises),\n rmdir: mutableFsPromises.rmdir.bind(mutableFsPromises),\n};\n\nlet installed = false;\n\nfunction toPathString(path: unknown): string | null {\n if (typeof path === \"string\") {\n return path;\n }\n if (Buffer.isBuffer(path)) {\n return path.toString();\n }\n if (path instanceof URL) {\n return fileURLToPath(path);\n }\n return null;\n}\n\nfunction activeVfsBySpecificity(): PatchableVirtualFileSystem[] {\n return [...activeVfs].sort((left, right) => {\n return (right.mountPoint?.length ?? 0) - (left.mountPoint?.length ?? 0);\n });\n}\n\nfunction findMountedVfs(path: unknown): { vfs: PatchableVirtualFileSystem; path: string } | null {\n const normalizedPath = toPathString(path);\n if (!normalizedPath) {\n return null;\n }\n\n for (const vfs of activeVfsBySpecificity()) {\n if (vfs.mounted && vfs.shouldHandle(normalizedPath)) {\n return { vfs, path: normalizedPath };\n }\n }\n\n return null;\n}\n\nfunction findMountedVfsForPaths(paths: unknown[], syscall: string): { vfs: PatchableVirtualFileSystem; paths: string[] } | null {\n let selected: PatchableVirtualFileSystem | null = null;\n const normalizedPaths: string[] = [];\n\n for (const path of paths) {\n const normalizedPath = toPathString(path);\n if (!normalizedPath) {\n normalizedPaths.push(String(path));\n continue;\n }\n\n normalizedPaths.push(normalizedPath);\n const match = findMountedVfs(normalizedPath);\n if (!match) {\n continue;\n }\n\n if (selected && selected !== match.vfs) {\n throw createNodeError(\n \"EXDEV\",\n `cross-device link not permitted, ${syscall} '${normalizedPaths.join(\"' -> '\")}'`,\n syscall,\n normalizedPath,\n );\n }\n\n selected = match.vfs;\n }\n\n if (!selected) {\n return null;\n }\n\n return { vfs: selected, paths: normalizedPaths };\n}\n\nfunction withCallback<T>(promise: Promise<T>, callback: (error: NodeJS.ErrnoException | null, result?: T) => void): void {\n promise.then(\n (result) => process.nextTick(callback, null, result),\n (error) => process.nextTick(callback, error as NodeJS.ErrnoException),\n );\n}\n\nfunction installFsWritePatches(): void {\n if (installed) {\n return;\n }\n\n mutableFs.writeFileSync = ((file: PathArg, data: unknown, options?: unknown) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.writeFileSync(file, data as never, options as never);\n }\n return match.vfs.writeFileSync(match.path, data, options);\n }) as typeof NodeFs.writeFileSync;\n\n mutableFs.appendFileSync = ((file: PathArg, data: unknown, options?: unknown) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.appendFileSync(file, data as never, options as never);\n }\n return match.vfs.appendFileSync(match.path, data, options);\n }) as typeof NodeFs.appendFileSync;\n\n mutableFs.mkdirSync = ((path: PathArg, options?: unknown) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.mkdirSync(path, options as never);\n }\n return match.vfs.mkdirSync(match.path, options);\n }) as typeof NodeFs.mkdirSync;\n\n mutableFs.renameSync = ((oldPath: PathArg, newPath: PathArg) => {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalFsMethods.renameSync(oldPath, newPath);\n }\n const [normalizedOld, normalizedNew] = match.paths;\n return match.vfs.renameSync(normalizedOld, normalizedNew);\n }) as typeof NodeFs.renameSync;\n\n mutableFs.unlinkSync = ((path: PathArg) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.unlinkSync(path);\n }\n return match.vfs.unlinkSync(match.path);\n }) as typeof NodeFs.unlinkSync;\n\n mutableFs.rmdirSync = ((path: PathArg, options?: unknown) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.rmdirSync(path, options as never);\n }\n return match.vfs.rmdirSync(match.path, options);\n }) as typeof NodeFs.rmdirSync;\n\n mutableFs.writeFile = ((file: PathArg, data: unknown, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.writeFile(file, data as never, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.writeFile(file, data as never, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.writeFile(match.path, data, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.writeFile;\n\n mutableFs.appendFile = ((file: PathArg, data: unknown, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.appendFile(file, data as never, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.appendFile(file, data as never, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.appendFile(match.path, data, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.appendFile;\n\n mutableFs.mkdir = ((path: PathArg, options?: unknown, callback?: MkdirCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.mkdir(path, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.mkdir(path, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.mkdir(match.path, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.mkdir;\n\n mutableFs.rename = ((oldPath: PathArg, newPath: PathArg, callback?: WriteCallback) => {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalFsMethods.rename(oldPath, newPath, callback as never);\n }\n if (typeof callback !== \"function\") {\n return originalFsMethods.rename(oldPath, newPath, callback as never);\n }\n\n const [normalizedOld, normalizedNew] = match.paths;\n withCallback(match.vfs.promises.rename(normalizedOld, normalizedNew), callback);\n }) as typeof NodeFs.rename;\n\n mutableFs.unlink = ((path: PathArg, callback?: WriteCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.unlink(path, callback as never);\n }\n if (typeof callback !== \"function\") {\n return originalFsMethods.unlink(path, callback as never);\n }\n\n withCallback(match.vfs.promises.unlink(match.path), callback);\n }) as typeof NodeFs.unlink;\n\n mutableFs.rmdir = ((path: PathArg, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.rmdir(path, options as never, callback as never);\n }\n\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.rmdir(path, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.rmdir(match.path, typeof options === \"function\" ? undefined : options), resolvedCallback);\n }) as typeof NodeFs.rmdir;\n\n const promisePatches: OriginalPromiseMethods = {\n async writeFile(file: PathArg, data: unknown, options?: unknown) {\n const match = findMountedVfs(file);\n if (!match) {\n return originalPromiseMethods.writeFile(file, data as never, options as never);\n }\n return match.vfs.promises.writeFile(match.path, data, options);\n },\n\n async appendFile(file: PathArg, data: unknown, options?: unknown) {\n const match = findMountedVfs(file);\n if (!match) {\n return originalPromiseMethods.appendFile(file, data as never, options as never);\n }\n return match.vfs.promises.appendFile(match.path, data, options);\n },\n\n async mkdir(path: PathArg, options?: unknown) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.mkdir(path, options as never);\n }\n return match.vfs.promises.mkdir(match.path, options);\n },\n\n async rename(oldPath: PathArg, newPath: PathArg) {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalPromiseMethods.rename(oldPath, newPath);\n }\n const [normalizedOld, normalizedNew] = match.paths;\n return match.vfs.promises.rename(normalizedOld, normalizedNew);\n },\n\n async unlink(path: PathArg) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.unlink(path);\n }\n return match.vfs.promises.unlink(match.path);\n },\n\n async rmdir(path: PathArg, options?: unknown) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.rmdir(path, options as never);\n }\n return match.vfs.promises.rmdir(match.path, options);\n },\n };\n\n mutableFs.promises.writeFile = promisePatches.writeFile;\n mutableFs.promises.appendFile = promisePatches.appendFile;\n mutableFs.promises.mkdir = promisePatches.mkdir;\n mutableFs.promises.rename = promisePatches.rename;\n mutableFs.promises.unlink = promisePatches.unlink;\n mutableFs.promises.rmdir = promisePatches.rmdir;\n\n mutableFsPromises.writeFile = promisePatches.writeFile;\n mutableFsPromises.appendFile = promisePatches.appendFile;\n mutableFsPromises.mkdir = promisePatches.mkdir;\n mutableFsPromises.rename = promisePatches.rename;\n mutableFsPromises.unlink = promisePatches.unlink;\n mutableFsPromises.rmdir = promisePatches.rmdir;\n\n syncBuiltinESMExports();\n installed = true;\n}\n\nfunction uninstallFsWritePatches(): void {\n if (!installed || activeVfs.size > 0) {\n return;\n }\n\n mutableFs.writeFileSync = originalFsMethods.writeFileSync;\n mutableFs.appendFileSync = originalFsMethods.appendFileSync;\n mutableFs.mkdirSync = originalFsMethods.mkdirSync;\n mutableFs.renameSync = originalFsMethods.renameSync;\n mutableFs.unlinkSync = originalFsMethods.unlinkSync;\n mutableFs.rmdirSync = originalFsMethods.rmdirSync;\n mutableFs.writeFile = originalFsMethods.writeFile;\n mutableFs.appendFile = originalFsMethods.appendFile;\n mutableFs.mkdir = originalFsMethods.mkdir;\n mutableFs.rename = originalFsMethods.rename;\n mutableFs.unlink = originalFsMethods.unlink;\n mutableFs.rmdir = originalFsMethods.rmdir;\n\n mutableFs.promises.writeFile = originalPromiseMethods.writeFile;\n mutableFs.promises.appendFile = originalPromiseMethods.appendFile;\n mutableFs.promises.mkdir = originalPromiseMethods.mkdir;\n mutableFs.promises.rename = originalPromiseMethods.rename;\n mutableFs.promises.unlink = originalPromiseMethods.unlink;\n mutableFs.promises.rmdir = originalPromiseMethods.rmdir;\n\n mutableFsPromises.writeFile = originalPromiseMethods.writeFile;\n mutableFsPromises.appendFile = originalPromiseMethods.appendFile;\n mutableFsPromises.mkdir = originalPromiseMethods.mkdir;\n mutableFsPromises.rename = originalPromiseMethods.rename;\n mutableFsPromises.unlink = originalPromiseMethods.unlink;\n mutableFsPromises.rmdir = originalPromiseMethods.rmdir;\n\n syncBuiltinESMExports();\n installed = false;\n}\n\nfunction registerMountedVfs(vfs: PatchableVirtualFileSystem): void {\n activeVfs.add(vfs);\n installFsWritePatches();\n}\n\nfunction deregisterMountedVfs(vfs: PatchableVirtualFileSystem): void {\n activeVfs.delete(vfs);\n uninstallFsWritePatches();\n}\n\nexport function wrapVfsWithFsWritePatches(vfs: VirtualFileSystem): VirtualFileSystem {\n const patchableVfs = vfs as PatchableVirtualFileSystem;\n const originalMount = vfs.mount.bind(vfs);\n const originalUnmount = vfs.unmount.bind(vfs);\n const originalDispose = patchableVfs[Symbol.dispose]?.bind(vfs);\n let registered = false;\n\n patchableVfs.mount = ((prefix: string) => {\n const mounted = originalMount(prefix);\n if (!registered) {\n registerMountedVfs(patchableVfs);\n registered = true;\n }\n return mounted;\n }) as typeof vfs.mount;\n\n patchableVfs.unmount = (() => {\n if (registered) {\n deregisterMountedVfs(patchableVfs);\n registered = false;\n }\n return originalUnmount();\n }) as typeof vfs.unmount;\n\n if (originalDispose) {\n patchableVfs[Symbol.dispose] = (() => {\n if (registered) {\n deregisterMountedVfs(patchableVfs);\n registered = false;\n }\n return originalDispose();\n }) as typeof patchableVfs[typeof Symbol.dispose];\n }\n\n return patchableVfs;\n}\n","import { posix as pathPosix } from \"node:path\";\n\nexport const INTERNAL_META_PREFIX = \".tcvfs-meta\";\n\nexport function normalizeVfsPath(inputPath: string): string {\n const normalized = pathPosix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n const absolute = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n return absolute;\n}\n\nexport function toLogicalPath(inputPath: string): string {\n const normalized = normalizeVfsPath(inputPath);\n\n if (normalized.includes(\"\\0\")) {\n throw new Error(\"invalid path\");\n }\n\n if (normalized === \"/\") {\n return \"\";\n }\n\n const logical = normalized.slice(1);\n if (\n logical === INTERNAL_META_PREFIX ||\n logical.startsWith(`${INTERNAL_META_PREFIX}/`) ||\n logical.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\"path escapes virtual root\");\n }\n\n return logical;\n}\n\nexport function normalizeStoragePrefix(prefix?: string): string {\n if (!prefix) {\n return \"\";\n }\n\n return prefix\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nexport function joinStoragePath(...parts: Array<string | undefined>): string {\n const cleaned = parts\n .filter((part): part is string => Boolean(part))\n .map((part) => normalizeStoragePrefix(part));\n\n return cleaned.filter(Boolean).join(\"/\");\n}\n\nexport function dirnameOf(logicalPath: string): string {\n if (!logicalPath) {\n return \"\";\n }\n\n const dir = pathPosix.dirname(`/${logicalPath}`);\n return dir === \"/\" ? \"\" : dir.slice(1);\n}\n\nexport function basenameOf(logicalPath: string): string {\n return pathPosix.basename(logicalPath ? `/${logicalPath}` : \"/\");\n}\n","import { INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix } from \"./pathing\";\nimport type { TinyCloudVfsFileEnvelope, TinyCloudVfsMetadata } from \"./types\";\n\nexport function dataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, logicalPath);\n}\n\nexport function metadataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function metadataPrefix(storageRoot: string, logicalPath = \"\"): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function encodeEnvelope(content: Buffer): TinyCloudVfsFileEnvelope {\n return {\n version: 1,\n encoding: \"base64\",\n data: content.toString(\"base64\"),\n };\n}\n\nfunction isEnvelopeShape(value: unknown): value is TinyCloudVfsFileEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as TinyCloudVfsFileEnvelope).version === 1 &&\n (value as TinyCloudVfsFileEnvelope).encoding === \"base64\" &&\n typeof (value as TinyCloudVfsFileEnvelope).data === \"string\"\n );\n}\n\nexport function encodeFileValue(content: Buffer): string | TinyCloudVfsFileEnvelope {\n const utf8 = content.toString(\"utf8\");\n if (Buffer.from(utf8, \"utf8\").equals(content)) {\n return utf8;\n }\n\n return encodeEnvelope(content);\n}\n\nexport function decodeEnvelope(value: unknown): Buffer {\n if (isEnvelopeShape(value)) {\n return Buffer.from((value as TinyCloudVfsFileEnvelope).data, \"base64\");\n }\n\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isEnvelopeShape(parsed)) {\n return Buffer.from(parsed.data, \"base64\");\n }\n } catch {\n // Plain text payloads are expected and should fall through.\n }\n\n return Buffer.from(value, \"utf8\");\n }\n\n throw new Error(\"unsupported file payload\");\n}\n\nfunction isMetadataShape(value: unknown): value is TinyCloudVfsMetadata {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (((value as TinyCloudVfsMetadata).kind === \"file\") || ((value as TinyCloudVfsMetadata).kind === \"directory\")) &&\n typeof (value as TinyCloudVfsMetadata).size === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mode === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).ctimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mtimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).birthtimeMs === \"number\"\n );\n}\n\nexport function decodeMetadata(value: unknown): TinyCloudVfsMetadata {\n if (isMetadataShape(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown;\n if (isMetadataShape(parsed)) {\n return parsed;\n }\n }\n\n throw new Error(\"unsupported metadata payload\");\n}\n\nexport function nowMetadata(kind: \"file\" | \"directory\", size: number, mode: number, existing?: TinyCloudVfsMetadata): TinyCloudVfsMetadata {\n const now = Date.now();\n return {\n kind,\n size,\n mode,\n ctimeMs: now,\n mtimeMs: now,\n birthtimeMs: existing?.birthtimeMs ?? now,\n };\n}\n\nexport function normalizeMode(kind: \"file\" | \"directory\", mode?: number): number {\n if (typeof mode === \"number\" && Number.isFinite(mode)) {\n return mode;\n }\n\n return kind === \"directory\" ? 0o755 : 0o644;\n}\n\nexport function stripStoragePrefix(fullKey: string, prefix: string): string {\n const normalizedPrefix = normalizeStoragePrefix(prefix);\n if (!normalizedPrefix) {\n return fullKey.replace(/^\\/+/, \"\");\n }\n\n const withSlash = `${normalizedPrefix}/`;\n if (fullKey === normalizedPrefix) {\n return \"\";\n }\n\n if (fullKey.startsWith(withSlash)) {\n return fullKey.slice(withSlash.length);\n }\n\n return fullKey;\n}\n"],"mappings":"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","names":["import_node_buffer","fs","fsPromises","import_node_path","pathPosix"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/TinyCloudVfsProvider.ts","../src/bridge.ts","../src/errors.ts","../src/fsPatch.ts","../src/pathing.ts","../src/metadata.ts"],"sourcesContent":["export {\n TinyCloudVfsProvider,\n createTinyCloudVfs,\n createTinyCloudVfsFromNode,\n createTinyCloudDelegatedVfs,\n} from \"./TinyCloudVfsProvider\";\n\nexport type {\n TinyCloudVfsMetadata,\n TinyCloudVfsOptions,\n TinyCloudVfsProviderOptions,\n TinyCloudVfsSessionData,\n TinyCloudVfsSource,\n CreateTinyCloudDelegatedVfsOptions,\n CreateTinyCloudNodeVfsOptions,\n} from \"./types\";\n","import { Buffer } from \"node:buffer\";\nimport { VirtualProvider, create } from \"@platformatic/vfs\";\nimport type { VirtualFileSystem } from \"@platformatic/vfs\";\nimport { TinyCloudVfsBridge } from \"./bridge\";\nimport {\n createEISDIR,\n createEROFS,\n fromWorkerError,\n} from \"./errors\";\nimport { wrapVfsWithFsWritePatches } from \"./fsPatch\";\nimport { normalizeMode } from \"./metadata\";\nimport { normalizeVfsPath } from \"./pathing\";\nimport type {\n CreateTinyCloudDelegatedVfsOptions,\n CreateTinyCloudNodeVfsOptions,\n TinyCloudVfsDirent,\n TinyCloudVfsMetadata,\n TinyCloudVfsOptions,\n TinyCloudVfsProviderOptions,\n TinyCloudVfsSource,\n TinyCloudVfsHandleState,\n TinyCloudNodeLike,\n WorkerResponse,\n} from \"./types\";\n\nconst S_IFREG = 0o100000;\nconst S_IFDIR = 0o040000;\nconst DEFAULT_BLOCK_SIZE = 4096;\n\nfunction createStats(metadata: TinyCloudVfsMetadata) {\n const mode = metadata.kind === \"directory\"\n ? (metadata.mode | S_IFDIR)\n : (metadata.mode | S_IFREG);\n\n return {\n dev: 0,\n mode,\n nlink: 1,\n uid: process.getuid?.() ?? 0,\n gid: process.getgid?.() ?? 0,\n rdev: 0,\n blksize: DEFAULT_BLOCK_SIZE,\n ino: 0,\n size: metadata.kind === \"directory\" ? DEFAULT_BLOCK_SIZE : metadata.size,\n blocks: metadata.kind === \"directory\" ? 8 : Math.ceil(metadata.size / 512),\n atimeMs: metadata.mtimeMs,\n mtimeMs: metadata.mtimeMs,\n ctimeMs: metadata.ctimeMs,\n birthtimeMs: metadata.birthtimeMs,\n atime: new Date(metadata.mtimeMs),\n mtime: new Date(metadata.mtimeMs),\n ctime: new Date(metadata.ctimeMs),\n birthtime: new Date(metadata.birthtimeMs),\n isFile: () => metadata.kind === \"file\",\n isDirectory: () => metadata.kind === \"directory\",\n isSymbolicLink: () => false,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction createDirent(entry: TinyCloudVfsDirent) {\n return {\n name: entry.name,\n parentPath: entry.parentPath,\n path: entry.parentPath,\n isFile: () => entry.kind === \"file\",\n isDirectory: () => entry.kind === \"directory\",\n isSymbolicLink: () => false,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction expectStatResult(response: WorkerResponse): TinyCloudVfsMetadata {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"metadata\" in response.result)) {\n throw new Error(\"worker returned an unexpected stat payload\");\n }\n return response.result.metadata;\n}\n\nfunction expectReadFileResult(response: WorkerResponse): { metadata: TinyCloudVfsMetadata; content: Uint8Array } {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"metadata\" in response.result) || !(\"content\" in response.result)) {\n throw new Error(\"worker returned an unexpected readFile payload\");\n }\n return response.result;\n}\n\nfunction expectReaddirResult(response: WorkerResponse): TinyCloudVfsDirent[] {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"entries\" in response.result)) {\n throw new Error(\"worker returned an unexpected readdir payload\");\n }\n return response.result.entries;\n}\n\nfunction isWriteFlag(flags = \"r\"): boolean {\n return /[wa+]/.test(flags);\n}\n\nfunction isAppendFlag(flags = \"r\"): boolean {\n return flags.startsWith(\"a\");\n}\n\nfunction isTruncateFlag(flags = \"r\"): boolean {\n return flags.startsWith(\"w\");\n}\n\nclass TinyCloudVfsFileHandle {\n private readonly bridge: TinyCloudVfsBridge;\n private readonly state: TinyCloudVfsHandleState;\n private closed = false;\n private dirty = false;\n private position = 0;\n\n constructor(bridge: TinyCloudVfsBridge, state: TinyCloudVfsHandleState) {\n this.bridge = bridge;\n this.state = state;\n\n if (isAppendFlag(state.flags)) {\n this.position = state.content.length;\n }\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new Error(\"file handle is closed\");\n }\n }\n\n private commit(): void {\n if (!this.dirty) {\n return;\n }\n\n const response = this.bridge.requestSync({\n type: \"writeFile\",\n path: this.state.path,\n content: this.state.content,\n mode: this.state.mode,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n this.dirty = false;\n }\n\n readSync(buffer: Buffer, offset: number, length: number, position: number | null): number {\n this.ensureOpen();\n const readFrom = position ?? this.position;\n const available = Math.max(0, this.state.content.length - readFrom);\n const bytesToRead = Math.min(length, available);\n if (bytesToRead === 0) {\n return 0;\n }\n\n this.state.content.copy(buffer, offset, readFrom, readFrom + bytesToRead);\n if (position === null || position === undefined) {\n this.position = readFrom + bytesToRead;\n }\n return bytesToRead;\n }\n\n writeSync(buffer: Buffer, offset: number, length: number, position: number | null): number {\n this.ensureOpen();\n const writeFrom = position ?? this.position;\n const data = buffer.subarray(offset, offset + length);\n const requiredLength = writeFrom + data.length;\n\n if (requiredLength > this.state.content.length) {\n const next = Buffer.alloc(requiredLength);\n this.state.content.copy(next, 0, 0, this.state.content.length);\n this.state.content = next;\n }\n\n data.copy(this.state.content, writeFrom);\n this.state.metadata = {\n ...this.state.metadata,\n size: this.state.content.length,\n mtimeMs: Date.now(),\n ctimeMs: Date.now(),\n };\n this.dirty = true;\n\n if (position === null || position === undefined) {\n this.position = writeFrom + data.length;\n }\n\n return data.length;\n }\n\n readFileSync(options?: BufferEncoding | { encoding?: BufferEncoding | null } | null): Buffer | string {\n this.ensureOpen();\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n if (encoding) {\n return this.state.content.toString(encoding);\n }\n return Buffer.from(this.state.content);\n }\n\n writeFileSync(data: string | Buffer, options?: BufferEncoding | { encoding?: BufferEncoding; mode?: number }): void {\n this.ensureOpen();\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n const buffer = typeof data === \"string\" ? Buffer.from(data, encoding) : Buffer.from(data);\n\n if (isAppendFlag(this.state.flags)) {\n this.state.content = Buffer.concat([this.state.content, buffer]);\n } else {\n this.state.content = Buffer.from(buffer);\n }\n\n this.state.metadata = {\n ...this.state.metadata,\n size: this.state.content.length,\n mtimeMs: Date.now(),\n ctimeMs: Date.now(),\n mode: normalizeMode(\"file\", typeof options === \"object\" ? options?.mode : this.state.mode),\n };\n this.dirty = true;\n this.position = this.state.content.length;\n }\n\n statSync() {\n this.ensureOpen();\n return createStats({\n ...this.state.metadata,\n size: this.state.content.length,\n });\n }\n\n closeSync(): void {\n this.ensureOpen();\n this.commit();\n this.closed = true;\n }\n}\n\nexport class TinyCloudVfsProvider extends VirtualProvider {\n private readonly bridge: TinyCloudVfsBridge;\n private readonly forceReadOnly: boolean;\n\n constructor(options: TinyCloudVfsProviderOptions) {\n super();\n this.forceReadOnly = options.readOnly === true;\n this.bridge = new TinyCloudVfsBridge({\n source: options.source,\n mountPrefix: options.mountPrefix ?? \"\",\n });\n }\n\n get readonly(): boolean {\n return this.forceReadOnly;\n }\n\n close(): void {\n this.bridge.close();\n }\n\n private ensureWritable(path: string, syscall: string): void {\n if (this.forceReadOnly) {\n throw createEROFS(syscall, path);\n }\n }\n\n private normalize(path: string): string {\n return normalizeVfsPath(path);\n }\n\n openSync(path: string, flags = \"r\", mode?: number) {\n const normalized = this.normalize(path);\n const writable = isWriteFlag(flags);\n\n if (writable) {\n this.ensureWritable(normalized, \"open\");\n }\n\n let metadata: TinyCloudVfsMetadata;\n let content = Buffer.alloc(0);\n\n try {\n const response = expectReadFileResult(this.bridge.requestSync({ type: \"readFile\", path: normalized }));\n metadata = response.metadata;\n content = Buffer.from(response.content);\n if (isTruncateFlag(flags)) {\n content = Buffer.alloc(0);\n metadata = {\n ...metadata,\n size: 0,\n mode: normalizeMode(\"file\", mode ?? metadata.mode),\n };\n }\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code !== \"ENOENT\" || !writable) {\n throw error;\n }\n\n metadata = {\n kind: \"file\",\n size: 0,\n mode: normalizeMode(\"file\", mode),\n ctimeMs: Date.now(),\n mtimeMs: Date.now(),\n birthtimeMs: Date.now(),\n };\n }\n\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"open\", normalized);\n }\n\n return new TinyCloudVfsFileHandle(this.bridge, {\n path: normalized,\n flags,\n mode: normalizeMode(\"file\", mode ?? metadata.mode),\n content,\n metadata,\n });\n }\n\n async open(path: string, flags = \"r\", mode?: number) {\n return this.openSync(path, flags, mode);\n }\n\n statSync(path: string) {\n const normalized = this.normalize(path);\n return createStats(expectStatResult(this.bridge.requestSync({ type: \"stat\", path: normalized })));\n }\n\n async stat(path: string) {\n return this.statSync(path);\n }\n\n lstatSync(path: string) {\n return this.statSync(path);\n }\n\n async lstat(path: string) {\n return this.lstatSync(path);\n }\n\n readdirSync(path: string, options?: { withFileTypes?: boolean }) {\n const normalized = this.normalize(path);\n const entries = expectReaddirResult(this.bridge.requestSync({ type: \"readdir\", path: normalized }));\n\n if (options?.withFileTypes) {\n return entries.map(createDirent);\n }\n\n return entries.map((entry: TinyCloudVfsDirent) => entry.name);\n }\n\n async readdir(path: string, options?: { withFileTypes?: boolean }) {\n return this.readdirSync(path, options);\n }\n\n mkdirSync(path: string, options?: { recursive?: boolean; mode?: number }) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"mkdir\");\n const response = this.bridge.requestSync({\n type: \"mkdir\",\n path: normalized,\n recursive: options?.recursive === true,\n mode: options?.mode,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n return options?.recursive ? normalized : undefined;\n }\n\n async mkdir(path: string, options?: { recursive?: boolean; mode?: number }) {\n return this.mkdirSync(path, options);\n }\n\n rmdirSync(path: string) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"rmdir\");\n const response = this.bridge.requestSync({ type: \"rmdir\", path: normalized });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async rmdir(path: string) {\n this.rmdirSync(path);\n }\n\n unlinkSync(path: string) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"unlink\");\n const response = this.bridge.requestSync({ type: \"unlink\", path: normalized });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async unlink(path: string) {\n this.unlinkSync(path);\n }\n\n renameSync(oldPath: string, newPath: string) {\n const normalizedOld = this.normalize(oldPath);\n const normalizedNew = this.normalize(newPath);\n this.ensureWritable(normalizedOld, \"rename\");\n const response = this.bridge.requestSync({\n type: \"rename\",\n oldPath: normalizedOld,\n newPath: normalizedNew,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async rename(oldPath: string, newPath: string) {\n this.renameSync(oldPath, newPath);\n }\n}\n\nfunction toSessionSource(node: TinyCloudNodeLike, host?: string): TinyCloudVfsSource {\n if (!node.session) {\n throw new Error(\"TinyCloudNode has no active session; call signIn() or restoreSession() first.\");\n }\n\n const resolvedHost = host ?? node.config?.host ?? \"https://node.tinycloud.xyz\";\n\n return {\n kind: \"session\",\n host: resolvedHost,\n session: node.session,\n };\n}\n\nexport function createTinyCloudVfs(options: TinyCloudVfsProviderOptions & TinyCloudVfsOptions): { provider: TinyCloudVfsProvider; vfs: VirtualFileSystem } {\n const provider = new TinyCloudVfsProvider(options);\n const vfs = wrapVfsWithFsWritePatches(create(provider, {\n moduleHooks: options.moduleHooks,\n overlay: options.overlay,\n virtualCwd: options.virtualCwd,\n }));\n\n if (options.mountPoint) {\n vfs.mount(options.mountPoint);\n }\n\n return { provider, vfs };\n}\n\nexport function createTinyCloudVfsFromNode(node: TinyCloudNodeLike, options: CreateTinyCloudNodeVfsOptions = {}) {\n return createTinyCloudVfs({\n ...options,\n source: toSessionSource(node, options.host),\n });\n}\n\nexport async function createTinyCloudDelegatedVfs(options: CreateTinyCloudDelegatedVfsOptions) {\n if (!options.node.session) {\n throw new Error(\"TinyCloudNode has no active session; call signIn() or restoreSession() first.\");\n }\n if (typeof options.node.useDelegation !== \"function\") {\n throw new Error(\"TinyCloudNode does not expose useDelegation().\");\n }\n\n const access = await options.node.useDelegation(options.delegation);\n if (!access?.session) {\n throw new Error(\"Delegated access does not expose a resolved session snapshot.\");\n }\n\n return createTinyCloudVfs({\n ...options,\n source: {\n kind: \"resolved-delegation\",\n host: options.host ?? options.delegation.host ?? \"https://node.tinycloud.xyz\",\n session: access.session,\n kvPrefix: access.kv?.config?.prefix ?? \"\",\n },\n });\n}\n","import { MessageChannel, Worker, receiveMessageOnPort } from \"node:worker_threads\";\nimport { join } from \"node:path\";\nimport type { TinyCloudVfsWorkerInit, WorkerRequest, WorkerResponse } from \"./types\";\nimport { createEIO } from \"./errors\";\n\nconst WAIT_SLICE_MS = 1_000;\n\nfunction createWaitSignal(): { buffer: SharedArrayBuffer; view: Int32Array } {\n const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);\n return {\n buffer,\n view: new Int32Array(buffer),\n };\n}\n\nfunction resolveWorkerSpecifier(): string | URL {\n if (typeof __dirname !== \"undefined\") {\n return join(__dirname, \"worker.cjs\");\n }\n\n return new URL(\"./worker.js\", import.meta.url);\n}\n\nexport class TinyCloudVfsBridge {\n private readonly worker: Worker;\n\n constructor(init: TinyCloudVfsWorkerInit) {\n const specifier = resolveWorkerSpecifier();\n this.worker = typeof specifier === \"string\"\n ? new Worker(specifier)\n : new Worker(specifier);\n\n const response = this.requestSync({ type: \"init\", init });\n if (!response.ok) {\n this.worker.terminate();\n throw createEIO(\"init\", \"/\", response.error.message);\n }\n }\n\n close(): void {\n void this.worker.terminate();\n }\n\n requestSync(request: WorkerRequest): WorkerResponse {\n const { port1, port2 } = new MessageChannel();\n const { buffer, view } = createWaitSignal();\n\n this.worker.postMessage(\n {\n request,\n replyPort: port1,\n waitBuffer: buffer,\n },\n [port1],\n );\n\n while (Atomics.load(view, 0) === 0) {\n Atomics.wait(view, 0, 0, WAIT_SLICE_MS);\n }\n\n const response = receiveMessageOnPort(port2)?.message as WorkerResponse | undefined;\n port2.close();\n if (!response) {\n throw createEIO(\"bridge\", \"/\", \"worker did not return a response\");\n }\n\n return response;\n }\n\n async requestAsync(request: WorkerRequest): Promise<WorkerResponse> {\n return this.requestSync(request);\n }\n}\n","const ERRNO: Record<string, number> = {\n EPERM: -1,\n ENOENT: -2,\n EIO: -5,\n EBADF: -9,\n EACCES: -13,\n EBUSY: -16,\n EEXIST: -17,\n ENOTDIR: -20,\n EISDIR: -21,\n EINVAL: -22,\n ENOTEMPTY: -39,\n ENOSPC: -28,\n EROFS: -30,\n};\n\nexport function createNodeError(\n code: string,\n message: string,\n syscall: string,\n path?: string,\n): NodeJS.ErrnoException {\n const error = new Error(message) as NodeJS.ErrnoException;\n error.code = code;\n error.errno = ERRNO[code] ?? -1;\n error.syscall = syscall;\n if (path) {\n error.path = path;\n }\n return error;\n}\n\nexport function createENOENT(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOENT\", `no such file or directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEISDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EISDIR\", `illegal operation on a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTDIR\", `not a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTEMPTY\", `directory not empty, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEEXIST(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EEXIST\", `file already exists, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEACCES(syscall: string, path: string, message = \"permission denied\"): NodeJS.ErrnoException {\n return createNodeError(\"EACCES\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEROFS(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EROFS\", `read-only file system, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEIO(syscall: string, path: string, message: string): NodeJS.ErrnoException {\n return createNodeError(\"EIO\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\n/** The owner's TinyCloud storage is full (or too small for this write); nothing was written. */\nexport function createENOSPC(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOSPC\", `TinyCloud storage is full; nothing was written, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEBUSY(syscall: string, path: string, message = \"resource busy or locked\"): NodeJS.ErrnoException {\n return createNodeError(\"EBUSY\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEINVAL(syscall: string, path: string, message = \"invalid argument\"): NodeJS.ErrnoException {\n return createNodeError(\"EINVAL\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function fromWorkerError(error: { code: string; message: string; syscall?: string; path?: string }): NodeJS.ErrnoException {\n return createNodeError(\n error.code,\n error.message,\n error.syscall ?? \"vfs\",\n error.path,\n );\n}\n","import { Buffer } from \"node:buffer\";\nimport fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport type * as NodeFs from \"node:fs\";\nimport type * as NodeFsPromises from \"node:fs/promises\";\nimport { syncBuiltinESMExports } from \"node:module\";\nimport type { VirtualFileSystem } from \"@platformatic/vfs\";\nimport { fileURLToPath } from \"node:url\";\nimport { createNodeError } from \"./errors\";\n\ntype PathArg = string | Buffer | URL;\ntype WriteCallback = (error: NodeJS.ErrnoException | null) => void;\ntype MkdirCallback = (error: NodeJS.ErrnoException | null, path?: string) => void;\n\ninterface PatchableVirtualFileSystem extends VirtualFileSystem {\n mountPoint: string | null;\n mounted: boolean;\n shouldHandle(path: string): boolean;\n writeFileSync(path: string, data: unknown, options?: unknown): void;\n appendFileSync(path: string, data: unknown, options?: unknown): void;\n mkdirSync(path: string, options?: unknown): string | undefined;\n renameSync(oldPath: string, newPath: string): void;\n unlinkSync(path: string): void;\n rmdirSync(path: string, options?: unknown): void;\n promises: {\n writeFile(path: string, data: unknown, options?: unknown): Promise<void>;\n appendFile(path: string, data: unknown, options?: unknown): Promise<void>;\n mkdir(path: string, options?: unknown): Promise<string | undefined>;\n rename(oldPath: string, newPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rmdir(path: string, options?: unknown): Promise<void>;\n };\n [Symbol.dispose]?: () => void;\n}\n\ninterface OriginalFsMethods {\n writeFileSync: typeof NodeFs.writeFileSync;\n appendFileSync: typeof NodeFs.appendFileSync;\n mkdirSync: typeof NodeFs.mkdirSync;\n renameSync: typeof NodeFs.renameSync;\n unlinkSync: typeof NodeFs.unlinkSync;\n rmdirSync: typeof NodeFs.rmdirSync;\n writeFile: typeof NodeFs.writeFile;\n appendFile: typeof NodeFs.appendFile;\n mkdir: typeof NodeFs.mkdir;\n rename: typeof NodeFs.rename;\n unlink: typeof NodeFs.unlink;\n rmdir: typeof NodeFs.rmdir;\n}\n\ninterface OriginalPromiseMethods {\n writeFile: typeof NodeFsPromises.writeFile;\n appendFile: typeof NodeFsPromises.appendFile;\n mkdir: typeof NodeFsPromises.mkdir;\n rename: typeof NodeFsPromises.rename;\n unlink: typeof NodeFsPromises.unlink;\n rmdir: typeof NodeFsPromises.rmdir;\n}\n\nconst activeVfs = new Set<PatchableVirtualFileSystem>();\nconst mutableFs = fs as typeof NodeFs & { promises: typeof NodeFsPromises };\nconst mutableFsPromises = fsPromises as typeof NodeFsPromises;\n\nconst originalFsMethods: OriginalFsMethods = {\n writeFileSync: mutableFs.writeFileSync.bind(mutableFs),\n appendFileSync: mutableFs.appendFileSync.bind(mutableFs),\n mkdirSync: mutableFs.mkdirSync.bind(mutableFs),\n renameSync: mutableFs.renameSync.bind(mutableFs),\n unlinkSync: mutableFs.unlinkSync.bind(mutableFs),\n rmdirSync: mutableFs.rmdirSync.bind(mutableFs),\n writeFile: mutableFs.writeFile.bind(mutableFs),\n appendFile: mutableFs.appendFile.bind(mutableFs),\n mkdir: mutableFs.mkdir.bind(mutableFs),\n rename: mutableFs.rename.bind(mutableFs),\n unlink: mutableFs.unlink.bind(mutableFs),\n rmdir: mutableFs.rmdir.bind(mutableFs),\n};\n\nconst originalPromiseMethods: OriginalPromiseMethods = {\n writeFile: mutableFsPromises.writeFile.bind(mutableFsPromises),\n appendFile: mutableFsPromises.appendFile.bind(mutableFsPromises),\n mkdir: mutableFsPromises.mkdir.bind(mutableFsPromises),\n rename: mutableFsPromises.rename.bind(mutableFsPromises),\n unlink: mutableFsPromises.unlink.bind(mutableFsPromises),\n rmdir: mutableFsPromises.rmdir.bind(mutableFsPromises),\n};\n\nlet installed = false;\n\nfunction toPathString(path: unknown): string | null {\n if (typeof path === \"string\") {\n return path;\n }\n if (Buffer.isBuffer(path)) {\n return path.toString();\n }\n if (path instanceof URL) {\n return fileURLToPath(path);\n }\n return null;\n}\n\nfunction activeVfsBySpecificity(): PatchableVirtualFileSystem[] {\n return [...activeVfs].sort((left, right) => {\n return (right.mountPoint?.length ?? 0) - (left.mountPoint?.length ?? 0);\n });\n}\n\nfunction findMountedVfs(path: unknown): { vfs: PatchableVirtualFileSystem; path: string } | null {\n const normalizedPath = toPathString(path);\n if (!normalizedPath) {\n return null;\n }\n\n for (const vfs of activeVfsBySpecificity()) {\n if (vfs.mounted && vfs.shouldHandle(normalizedPath)) {\n return { vfs, path: normalizedPath };\n }\n }\n\n return null;\n}\n\nfunction findMountedVfsForPaths(paths: unknown[], syscall: string): { vfs: PatchableVirtualFileSystem; paths: string[] } | null {\n let selected: PatchableVirtualFileSystem | null = null;\n const normalizedPaths: string[] = [];\n\n for (const path of paths) {\n const normalizedPath = toPathString(path);\n if (!normalizedPath) {\n normalizedPaths.push(String(path));\n continue;\n }\n\n normalizedPaths.push(normalizedPath);\n const match = findMountedVfs(normalizedPath);\n if (!match) {\n continue;\n }\n\n if (selected && selected !== match.vfs) {\n throw createNodeError(\n \"EXDEV\",\n `cross-device link not permitted, ${syscall} '${normalizedPaths.join(\"' -> '\")}'`,\n syscall,\n normalizedPath,\n );\n }\n\n selected = match.vfs;\n }\n\n if (!selected) {\n return null;\n }\n\n return { vfs: selected, paths: normalizedPaths };\n}\n\nfunction withCallback<T>(promise: Promise<T>, callback: (error: NodeJS.ErrnoException | null, result?: T) => void): void {\n promise.then(\n (result) => process.nextTick(callback, null, result),\n (error) => process.nextTick(callback, error as NodeJS.ErrnoException),\n );\n}\n\nfunction installFsWritePatches(): void {\n if (installed) {\n return;\n }\n\n mutableFs.writeFileSync = ((file: PathArg, data: unknown, options?: unknown) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.writeFileSync(file, data as never, options as never);\n }\n return match.vfs.writeFileSync(match.path, data, options);\n }) as typeof NodeFs.writeFileSync;\n\n mutableFs.appendFileSync = ((file: PathArg, data: unknown, options?: unknown) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.appendFileSync(file, data as never, options as never);\n }\n return match.vfs.appendFileSync(match.path, data, options);\n }) as typeof NodeFs.appendFileSync;\n\n mutableFs.mkdirSync = ((path: PathArg, options?: unknown) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.mkdirSync(path, options as never);\n }\n return match.vfs.mkdirSync(match.path, options);\n }) as typeof NodeFs.mkdirSync;\n\n mutableFs.renameSync = ((oldPath: PathArg, newPath: PathArg) => {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalFsMethods.renameSync(oldPath, newPath);\n }\n const [normalizedOld, normalizedNew] = match.paths;\n return match.vfs.renameSync(normalizedOld, normalizedNew);\n }) as typeof NodeFs.renameSync;\n\n mutableFs.unlinkSync = ((path: PathArg) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.unlinkSync(path);\n }\n return match.vfs.unlinkSync(match.path);\n }) as typeof NodeFs.unlinkSync;\n\n mutableFs.rmdirSync = ((path: PathArg, options?: unknown) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.rmdirSync(path, options as never);\n }\n return match.vfs.rmdirSync(match.path, options);\n }) as typeof NodeFs.rmdirSync;\n\n mutableFs.writeFile = ((file: PathArg, data: unknown, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.writeFile(file, data as never, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.writeFile(file, data as never, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.writeFile(match.path, data, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.writeFile;\n\n mutableFs.appendFile = ((file: PathArg, data: unknown, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.appendFile(file, data as never, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.appendFile(file, data as never, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.appendFile(match.path, data, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.appendFile;\n\n mutableFs.mkdir = ((path: PathArg, options?: unknown, callback?: MkdirCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.mkdir(path, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.mkdir(path, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.mkdir(match.path, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.mkdir;\n\n mutableFs.rename = ((oldPath: PathArg, newPath: PathArg, callback?: WriteCallback) => {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalFsMethods.rename(oldPath, newPath, callback as never);\n }\n if (typeof callback !== \"function\") {\n return originalFsMethods.rename(oldPath, newPath, callback as never);\n }\n\n const [normalizedOld, normalizedNew] = match.paths;\n withCallback(match.vfs.promises.rename(normalizedOld, normalizedNew), callback);\n }) as typeof NodeFs.rename;\n\n mutableFs.unlink = ((path: PathArg, callback?: WriteCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.unlink(path, callback as never);\n }\n if (typeof callback !== \"function\") {\n return originalFsMethods.unlink(path, callback as never);\n }\n\n withCallback(match.vfs.promises.unlink(match.path), callback);\n }) as typeof NodeFs.unlink;\n\n mutableFs.rmdir = ((path: PathArg, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.rmdir(path, options as never, callback as never);\n }\n\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.rmdir(path, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.rmdir(match.path, typeof options === \"function\" ? undefined : options), resolvedCallback);\n }) as typeof NodeFs.rmdir;\n\n const promisePatches: OriginalPromiseMethods = {\n async writeFile(file: PathArg, data: unknown, options?: unknown) {\n const match = findMountedVfs(file);\n if (!match) {\n return originalPromiseMethods.writeFile(file, data as never, options as never);\n }\n return match.vfs.promises.writeFile(match.path, data, options);\n },\n\n async appendFile(file: PathArg, data: unknown, options?: unknown) {\n const match = findMountedVfs(file);\n if (!match) {\n return originalPromiseMethods.appendFile(file, data as never, options as never);\n }\n return match.vfs.promises.appendFile(match.path, data, options);\n },\n\n async mkdir(path: PathArg, options?: unknown) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.mkdir(path, options as never);\n }\n return match.vfs.promises.mkdir(match.path, options);\n },\n\n async rename(oldPath: PathArg, newPath: PathArg) {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalPromiseMethods.rename(oldPath, newPath);\n }\n const [normalizedOld, normalizedNew] = match.paths;\n return match.vfs.promises.rename(normalizedOld, normalizedNew);\n },\n\n async unlink(path: PathArg) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.unlink(path);\n }\n return match.vfs.promises.unlink(match.path);\n },\n\n async rmdir(path: PathArg, options?: unknown) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.rmdir(path, options as never);\n }\n return match.vfs.promises.rmdir(match.path, options);\n },\n };\n\n mutableFs.promises.writeFile = promisePatches.writeFile;\n mutableFs.promises.appendFile = promisePatches.appendFile;\n mutableFs.promises.mkdir = promisePatches.mkdir;\n mutableFs.promises.rename = promisePatches.rename;\n mutableFs.promises.unlink = promisePatches.unlink;\n mutableFs.promises.rmdir = promisePatches.rmdir;\n\n mutableFsPromises.writeFile = promisePatches.writeFile;\n mutableFsPromises.appendFile = promisePatches.appendFile;\n mutableFsPromises.mkdir = promisePatches.mkdir;\n mutableFsPromises.rename = promisePatches.rename;\n mutableFsPromises.unlink = promisePatches.unlink;\n mutableFsPromises.rmdir = promisePatches.rmdir;\n\n syncBuiltinESMExports();\n installed = true;\n}\n\nfunction uninstallFsWritePatches(): void {\n if (!installed || activeVfs.size > 0) {\n return;\n }\n\n mutableFs.writeFileSync = originalFsMethods.writeFileSync;\n mutableFs.appendFileSync = originalFsMethods.appendFileSync;\n mutableFs.mkdirSync = originalFsMethods.mkdirSync;\n mutableFs.renameSync = originalFsMethods.renameSync;\n mutableFs.unlinkSync = originalFsMethods.unlinkSync;\n mutableFs.rmdirSync = originalFsMethods.rmdirSync;\n mutableFs.writeFile = originalFsMethods.writeFile;\n mutableFs.appendFile = originalFsMethods.appendFile;\n mutableFs.mkdir = originalFsMethods.mkdir;\n mutableFs.rename = originalFsMethods.rename;\n mutableFs.unlink = originalFsMethods.unlink;\n mutableFs.rmdir = originalFsMethods.rmdir;\n\n mutableFs.promises.writeFile = originalPromiseMethods.writeFile;\n mutableFs.promises.appendFile = originalPromiseMethods.appendFile;\n mutableFs.promises.mkdir = originalPromiseMethods.mkdir;\n mutableFs.promises.rename = originalPromiseMethods.rename;\n mutableFs.promises.unlink = originalPromiseMethods.unlink;\n mutableFs.promises.rmdir = originalPromiseMethods.rmdir;\n\n mutableFsPromises.writeFile = originalPromiseMethods.writeFile;\n mutableFsPromises.appendFile = originalPromiseMethods.appendFile;\n mutableFsPromises.mkdir = originalPromiseMethods.mkdir;\n mutableFsPromises.rename = originalPromiseMethods.rename;\n mutableFsPromises.unlink = originalPromiseMethods.unlink;\n mutableFsPromises.rmdir = originalPromiseMethods.rmdir;\n\n syncBuiltinESMExports();\n installed = false;\n}\n\nfunction registerMountedVfs(vfs: PatchableVirtualFileSystem): void {\n activeVfs.add(vfs);\n installFsWritePatches();\n}\n\nfunction deregisterMountedVfs(vfs: PatchableVirtualFileSystem): void {\n activeVfs.delete(vfs);\n uninstallFsWritePatches();\n}\n\nexport function wrapVfsWithFsWritePatches(vfs: VirtualFileSystem): VirtualFileSystem {\n const patchableVfs = vfs as PatchableVirtualFileSystem;\n const originalMount = vfs.mount.bind(vfs);\n const originalUnmount = vfs.unmount.bind(vfs);\n const originalDispose = patchableVfs[Symbol.dispose]?.bind(vfs);\n let registered = false;\n\n patchableVfs.mount = ((prefix: string) => {\n const mounted = originalMount(prefix);\n if (!registered) {\n registerMountedVfs(patchableVfs);\n registered = true;\n }\n return mounted;\n }) as typeof vfs.mount;\n\n patchableVfs.unmount = (() => {\n if (registered) {\n deregisterMountedVfs(patchableVfs);\n registered = false;\n }\n return originalUnmount();\n }) as typeof vfs.unmount;\n\n if (originalDispose) {\n patchableVfs[Symbol.dispose] = (() => {\n if (registered) {\n deregisterMountedVfs(patchableVfs);\n registered = false;\n }\n return originalDispose();\n }) as typeof patchableVfs[typeof Symbol.dispose];\n }\n\n return patchableVfs;\n}\n","import { posix as pathPosix } from \"node:path\";\n\nexport const INTERNAL_META_PREFIX = \".tcvfs-meta\";\n\nexport function normalizeVfsPath(inputPath: string): string {\n const normalized = pathPosix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n const absolute = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n return absolute;\n}\n\nexport function toLogicalPath(inputPath: string): string {\n const normalized = normalizeVfsPath(inputPath);\n\n if (normalized.includes(\"\\0\")) {\n throw new Error(\"invalid path\");\n }\n\n if (normalized === \"/\") {\n return \"\";\n }\n\n const logical = normalized.slice(1);\n if (\n logical === INTERNAL_META_PREFIX ||\n logical.startsWith(`${INTERNAL_META_PREFIX}/`) ||\n logical.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\"path escapes virtual root\");\n }\n\n return logical;\n}\n\nexport function normalizeStoragePrefix(prefix?: string): string {\n if (!prefix) {\n return \"\";\n }\n\n return prefix\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nexport function joinStoragePath(...parts: Array<string | undefined>): string {\n const cleaned = parts\n .filter((part): part is string => Boolean(part))\n .map((part) => normalizeStoragePrefix(part));\n\n return cleaned.filter(Boolean).join(\"/\");\n}\n\nexport function dirnameOf(logicalPath: string): string {\n if (!logicalPath) {\n return \"\";\n }\n\n const dir = pathPosix.dirname(`/${logicalPath}`);\n return dir === \"/\" ? \"\" : dir.slice(1);\n}\n\nexport function basenameOf(logicalPath: string): string {\n return pathPosix.basename(logicalPath ? `/${logicalPath}` : \"/\");\n}\n","import { INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix } from \"./pathing\";\nimport type { TinyCloudVfsFileEnvelope, TinyCloudVfsMetadata } from \"./types\";\n\nexport function dataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, logicalPath);\n}\n\nexport function metadataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function metadataPrefix(storageRoot: string, logicalPath = \"\"): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function encodeEnvelope(content: Buffer): TinyCloudVfsFileEnvelope {\n return {\n version: 1,\n encoding: \"base64\",\n data: content.toString(\"base64\"),\n };\n}\n\nfunction isEnvelopeShape(value: unknown): value is TinyCloudVfsFileEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as TinyCloudVfsFileEnvelope).version === 1 &&\n (value as TinyCloudVfsFileEnvelope).encoding === \"base64\" &&\n typeof (value as TinyCloudVfsFileEnvelope).data === \"string\"\n );\n}\n\nexport function encodeFileValue(content: Buffer): string | TinyCloudVfsFileEnvelope {\n const utf8 = content.toString(\"utf8\");\n if (Buffer.from(utf8, \"utf8\").equals(content)) {\n return utf8;\n }\n\n return encodeEnvelope(content);\n}\n\nexport function decodeEnvelope(value: unknown): Buffer {\n if (isEnvelopeShape(value)) {\n return Buffer.from((value as TinyCloudVfsFileEnvelope).data, \"base64\");\n }\n\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isEnvelopeShape(parsed)) {\n return Buffer.from(parsed.data, \"base64\");\n }\n } catch {\n // Plain text payloads are expected and should fall through.\n }\n\n return Buffer.from(value, \"utf8\");\n }\n\n throw new Error(\"unsupported file payload\");\n}\n\nfunction isMetadataShape(value: unknown): value is TinyCloudVfsMetadata {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (((value as TinyCloudVfsMetadata).kind === \"file\") || ((value as TinyCloudVfsMetadata).kind === \"directory\")) &&\n typeof (value as TinyCloudVfsMetadata).size === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mode === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).ctimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mtimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).birthtimeMs === \"number\"\n );\n}\n\nexport function decodeMetadata(value: unknown): TinyCloudVfsMetadata {\n if (isMetadataShape(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown;\n if (isMetadataShape(parsed)) {\n return parsed;\n }\n }\n\n throw new Error(\"unsupported metadata payload\");\n}\n\nexport function nowMetadata(kind: \"file\" | \"directory\", size: number, mode: number, existing?: TinyCloudVfsMetadata): TinyCloudVfsMetadata {\n const now = Date.now();\n return {\n kind,\n size,\n mode,\n ctimeMs: now,\n mtimeMs: now,\n birthtimeMs: existing?.birthtimeMs ?? now,\n };\n}\n\nexport function normalizeMode(kind: \"file\" | \"directory\", mode?: number): number {\n if (typeof mode === \"number\" && Number.isFinite(mode)) {\n return mode;\n }\n\n return kind === \"directory\" ? 0o755 : 0o644;\n}\n\nexport function stripStoragePrefix(fullKey: string, prefix: string): string {\n const normalizedPrefix = normalizeStoragePrefix(prefix);\n if (!normalizedPrefix) {\n return fullKey.replace(/^\\/+/, \"\");\n }\n\n const withSlash = `${normalizedPrefix}/`;\n if (fullKey === normalizedPrefix) {\n return \"\";\n }\n\n if (fullKey.startsWith(withSlash)) {\n return fullKey.slice(withSlash.length);\n }\n\n return fullKey;\n}\n"],"mappings":"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","names":["import_node_buffer","fs","fsPromises","import_node_path","pathPosix"]}
package/dist/index.js CHANGED
@@ -19,6 +19,7 @@ var ERRNO = {
19
19
  EISDIR: -21,
20
20
  EINVAL: -22,
21
21
  ENOTEMPTY: -39,
22
+ ENOSPC: -28,
22
23
  EROFS: -30
23
24
  };
24
25
  function createNodeError(code, message, syscall, path) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TinyCloudVfsProvider.ts","../src/bridge.ts","../src/errors.ts","../src/fsPatch.ts","../src/pathing.ts","../src/metadata.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { VirtualProvider, create } from \"@platformatic/vfs\";\nimport type { VirtualFileSystem } from \"@platformatic/vfs\";\nimport { TinyCloudVfsBridge } from \"./bridge\";\nimport {\n createEISDIR,\n createEROFS,\n fromWorkerError,\n} from \"./errors\";\nimport { wrapVfsWithFsWritePatches } from \"./fsPatch\";\nimport { normalizeMode } from \"./metadata\";\nimport { normalizeVfsPath } from \"./pathing\";\nimport type {\n CreateTinyCloudDelegatedVfsOptions,\n CreateTinyCloudNodeVfsOptions,\n TinyCloudVfsDirent,\n TinyCloudVfsMetadata,\n TinyCloudVfsOptions,\n TinyCloudVfsProviderOptions,\n TinyCloudVfsSource,\n TinyCloudVfsHandleState,\n TinyCloudNodeLike,\n WorkerResponse,\n} from \"./types\";\n\nconst S_IFREG = 0o100000;\nconst S_IFDIR = 0o040000;\nconst DEFAULT_BLOCK_SIZE = 4096;\n\nfunction createStats(metadata: TinyCloudVfsMetadata) {\n const mode = metadata.kind === \"directory\"\n ? (metadata.mode | S_IFDIR)\n : (metadata.mode | S_IFREG);\n\n return {\n dev: 0,\n mode,\n nlink: 1,\n uid: process.getuid?.() ?? 0,\n gid: process.getgid?.() ?? 0,\n rdev: 0,\n blksize: DEFAULT_BLOCK_SIZE,\n ino: 0,\n size: metadata.kind === \"directory\" ? DEFAULT_BLOCK_SIZE : metadata.size,\n blocks: metadata.kind === \"directory\" ? 8 : Math.ceil(metadata.size / 512),\n atimeMs: metadata.mtimeMs,\n mtimeMs: metadata.mtimeMs,\n ctimeMs: metadata.ctimeMs,\n birthtimeMs: metadata.birthtimeMs,\n atime: new Date(metadata.mtimeMs),\n mtime: new Date(metadata.mtimeMs),\n ctime: new Date(metadata.ctimeMs),\n birthtime: new Date(metadata.birthtimeMs),\n isFile: () => metadata.kind === \"file\",\n isDirectory: () => metadata.kind === \"directory\",\n isSymbolicLink: () => false,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction createDirent(entry: TinyCloudVfsDirent) {\n return {\n name: entry.name,\n parentPath: entry.parentPath,\n path: entry.parentPath,\n isFile: () => entry.kind === \"file\",\n isDirectory: () => entry.kind === \"directory\",\n isSymbolicLink: () => false,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction expectStatResult(response: WorkerResponse): TinyCloudVfsMetadata {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"metadata\" in response.result)) {\n throw new Error(\"worker returned an unexpected stat payload\");\n }\n return response.result.metadata;\n}\n\nfunction expectReadFileResult(response: WorkerResponse): { metadata: TinyCloudVfsMetadata; content: Uint8Array } {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"metadata\" in response.result) || !(\"content\" in response.result)) {\n throw new Error(\"worker returned an unexpected readFile payload\");\n }\n return response.result;\n}\n\nfunction expectReaddirResult(response: WorkerResponse): TinyCloudVfsDirent[] {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"entries\" in response.result)) {\n throw new Error(\"worker returned an unexpected readdir payload\");\n }\n return response.result.entries;\n}\n\nfunction isWriteFlag(flags = \"r\"): boolean {\n return /[wa+]/.test(flags);\n}\n\nfunction isAppendFlag(flags = \"r\"): boolean {\n return flags.startsWith(\"a\");\n}\n\nfunction isTruncateFlag(flags = \"r\"): boolean {\n return flags.startsWith(\"w\");\n}\n\nclass TinyCloudVfsFileHandle {\n private readonly bridge: TinyCloudVfsBridge;\n private readonly state: TinyCloudVfsHandleState;\n private closed = false;\n private dirty = false;\n private position = 0;\n\n constructor(bridge: TinyCloudVfsBridge, state: TinyCloudVfsHandleState) {\n this.bridge = bridge;\n this.state = state;\n\n if (isAppendFlag(state.flags)) {\n this.position = state.content.length;\n }\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new Error(\"file handle is closed\");\n }\n }\n\n private commit(): void {\n if (!this.dirty) {\n return;\n }\n\n const response = this.bridge.requestSync({\n type: \"writeFile\",\n path: this.state.path,\n content: this.state.content,\n mode: this.state.mode,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n this.dirty = false;\n }\n\n readSync(buffer: Buffer, offset: number, length: number, position: number | null): number {\n this.ensureOpen();\n const readFrom = position ?? this.position;\n const available = Math.max(0, this.state.content.length - readFrom);\n const bytesToRead = Math.min(length, available);\n if (bytesToRead === 0) {\n return 0;\n }\n\n this.state.content.copy(buffer, offset, readFrom, readFrom + bytesToRead);\n if (position === null || position === undefined) {\n this.position = readFrom + bytesToRead;\n }\n return bytesToRead;\n }\n\n writeSync(buffer: Buffer, offset: number, length: number, position: number | null): number {\n this.ensureOpen();\n const writeFrom = position ?? this.position;\n const data = buffer.subarray(offset, offset + length);\n const requiredLength = writeFrom + data.length;\n\n if (requiredLength > this.state.content.length) {\n const next = Buffer.alloc(requiredLength);\n this.state.content.copy(next, 0, 0, this.state.content.length);\n this.state.content = next;\n }\n\n data.copy(this.state.content, writeFrom);\n this.state.metadata = {\n ...this.state.metadata,\n size: this.state.content.length,\n mtimeMs: Date.now(),\n ctimeMs: Date.now(),\n };\n this.dirty = true;\n\n if (position === null || position === undefined) {\n this.position = writeFrom + data.length;\n }\n\n return data.length;\n }\n\n readFileSync(options?: BufferEncoding | { encoding?: BufferEncoding | null } | null): Buffer | string {\n this.ensureOpen();\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n if (encoding) {\n return this.state.content.toString(encoding);\n }\n return Buffer.from(this.state.content);\n }\n\n writeFileSync(data: string | Buffer, options?: BufferEncoding | { encoding?: BufferEncoding; mode?: number }): void {\n this.ensureOpen();\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n const buffer = typeof data === \"string\" ? Buffer.from(data, encoding) : Buffer.from(data);\n\n if (isAppendFlag(this.state.flags)) {\n this.state.content = Buffer.concat([this.state.content, buffer]);\n } else {\n this.state.content = Buffer.from(buffer);\n }\n\n this.state.metadata = {\n ...this.state.metadata,\n size: this.state.content.length,\n mtimeMs: Date.now(),\n ctimeMs: Date.now(),\n mode: normalizeMode(\"file\", typeof options === \"object\" ? options?.mode : this.state.mode),\n };\n this.dirty = true;\n this.position = this.state.content.length;\n }\n\n statSync() {\n this.ensureOpen();\n return createStats({\n ...this.state.metadata,\n size: this.state.content.length,\n });\n }\n\n closeSync(): void {\n this.ensureOpen();\n this.commit();\n this.closed = true;\n }\n}\n\nexport class TinyCloudVfsProvider extends VirtualProvider {\n private readonly bridge: TinyCloudVfsBridge;\n private readonly forceReadOnly: boolean;\n\n constructor(options: TinyCloudVfsProviderOptions) {\n super();\n this.forceReadOnly = options.readOnly === true;\n this.bridge = new TinyCloudVfsBridge({\n source: options.source,\n mountPrefix: options.mountPrefix ?? \"\",\n });\n }\n\n get readonly(): boolean {\n return this.forceReadOnly;\n }\n\n close(): void {\n this.bridge.close();\n }\n\n private ensureWritable(path: string, syscall: string): void {\n if (this.forceReadOnly) {\n throw createEROFS(syscall, path);\n }\n }\n\n private normalize(path: string): string {\n return normalizeVfsPath(path);\n }\n\n openSync(path: string, flags = \"r\", mode?: number) {\n const normalized = this.normalize(path);\n const writable = isWriteFlag(flags);\n\n if (writable) {\n this.ensureWritable(normalized, \"open\");\n }\n\n let metadata: TinyCloudVfsMetadata;\n let content = Buffer.alloc(0);\n\n try {\n const response = expectReadFileResult(this.bridge.requestSync({ type: \"readFile\", path: normalized }));\n metadata = response.metadata;\n content = Buffer.from(response.content);\n if (isTruncateFlag(flags)) {\n content = Buffer.alloc(0);\n metadata = {\n ...metadata,\n size: 0,\n mode: normalizeMode(\"file\", mode ?? metadata.mode),\n };\n }\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code !== \"ENOENT\" || !writable) {\n throw error;\n }\n\n metadata = {\n kind: \"file\",\n size: 0,\n mode: normalizeMode(\"file\", mode),\n ctimeMs: Date.now(),\n mtimeMs: Date.now(),\n birthtimeMs: Date.now(),\n };\n }\n\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"open\", normalized);\n }\n\n return new TinyCloudVfsFileHandle(this.bridge, {\n path: normalized,\n flags,\n mode: normalizeMode(\"file\", mode ?? metadata.mode),\n content,\n metadata,\n });\n }\n\n async open(path: string, flags = \"r\", mode?: number) {\n return this.openSync(path, flags, mode);\n }\n\n statSync(path: string) {\n const normalized = this.normalize(path);\n return createStats(expectStatResult(this.bridge.requestSync({ type: \"stat\", path: normalized })));\n }\n\n async stat(path: string) {\n return this.statSync(path);\n }\n\n lstatSync(path: string) {\n return this.statSync(path);\n }\n\n async lstat(path: string) {\n return this.lstatSync(path);\n }\n\n readdirSync(path: string, options?: { withFileTypes?: boolean }) {\n const normalized = this.normalize(path);\n const entries = expectReaddirResult(this.bridge.requestSync({ type: \"readdir\", path: normalized }));\n\n if (options?.withFileTypes) {\n return entries.map(createDirent);\n }\n\n return entries.map((entry: TinyCloudVfsDirent) => entry.name);\n }\n\n async readdir(path: string, options?: { withFileTypes?: boolean }) {\n return this.readdirSync(path, options);\n }\n\n mkdirSync(path: string, options?: { recursive?: boolean; mode?: number }) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"mkdir\");\n const response = this.bridge.requestSync({\n type: \"mkdir\",\n path: normalized,\n recursive: options?.recursive === true,\n mode: options?.mode,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n return options?.recursive ? normalized : undefined;\n }\n\n async mkdir(path: string, options?: { recursive?: boolean; mode?: number }) {\n return this.mkdirSync(path, options);\n }\n\n rmdirSync(path: string) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"rmdir\");\n const response = this.bridge.requestSync({ type: \"rmdir\", path: normalized });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async rmdir(path: string) {\n this.rmdirSync(path);\n }\n\n unlinkSync(path: string) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"unlink\");\n const response = this.bridge.requestSync({ type: \"unlink\", path: normalized });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async unlink(path: string) {\n this.unlinkSync(path);\n }\n\n renameSync(oldPath: string, newPath: string) {\n const normalizedOld = this.normalize(oldPath);\n const normalizedNew = this.normalize(newPath);\n this.ensureWritable(normalizedOld, \"rename\");\n const response = this.bridge.requestSync({\n type: \"rename\",\n oldPath: normalizedOld,\n newPath: normalizedNew,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async rename(oldPath: string, newPath: string) {\n this.renameSync(oldPath, newPath);\n }\n}\n\nfunction toSessionSource(node: TinyCloudNodeLike, host?: string): TinyCloudVfsSource {\n if (!node.session) {\n throw new Error(\"TinyCloudNode has no active session; call signIn() or restoreSession() first.\");\n }\n\n const resolvedHost = host ?? node.config?.host ?? \"https://node.tinycloud.xyz\";\n\n return {\n kind: \"session\",\n host: resolvedHost,\n session: node.session,\n };\n}\n\nexport function createTinyCloudVfs(options: TinyCloudVfsProviderOptions & TinyCloudVfsOptions): { provider: TinyCloudVfsProvider; vfs: VirtualFileSystem } {\n const provider = new TinyCloudVfsProvider(options);\n const vfs = wrapVfsWithFsWritePatches(create(provider, {\n moduleHooks: options.moduleHooks,\n overlay: options.overlay,\n virtualCwd: options.virtualCwd,\n }));\n\n if (options.mountPoint) {\n vfs.mount(options.mountPoint);\n }\n\n return { provider, vfs };\n}\n\nexport function createTinyCloudVfsFromNode(node: TinyCloudNodeLike, options: CreateTinyCloudNodeVfsOptions = {}) {\n return createTinyCloudVfs({\n ...options,\n source: toSessionSource(node, options.host),\n });\n}\n\nexport async function createTinyCloudDelegatedVfs(options: CreateTinyCloudDelegatedVfsOptions) {\n if (!options.node.session) {\n throw new Error(\"TinyCloudNode has no active session; call signIn() or restoreSession() first.\");\n }\n if (typeof options.node.useDelegation !== \"function\") {\n throw new Error(\"TinyCloudNode does not expose useDelegation().\");\n }\n\n const access = await options.node.useDelegation(options.delegation);\n if (!access?.session) {\n throw new Error(\"Delegated access does not expose a resolved session snapshot.\");\n }\n\n return createTinyCloudVfs({\n ...options,\n source: {\n kind: \"resolved-delegation\",\n host: options.host ?? options.delegation.host ?? \"https://node.tinycloud.xyz\",\n session: access.session,\n kvPrefix: access.kv?.config?.prefix ?? \"\",\n },\n });\n}\n","import { MessageChannel, Worker, receiveMessageOnPort } from \"node:worker_threads\";\nimport { join } from \"node:path\";\nimport type { TinyCloudVfsWorkerInit, WorkerRequest, WorkerResponse } from \"./types\";\nimport { createEIO } from \"./errors\";\n\nconst WAIT_SLICE_MS = 1_000;\n\nfunction createWaitSignal(): { buffer: SharedArrayBuffer; view: Int32Array } {\n const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);\n return {\n buffer,\n view: new Int32Array(buffer),\n };\n}\n\nfunction resolveWorkerSpecifier(): string | URL {\n if (typeof __dirname !== \"undefined\") {\n return join(__dirname, \"worker.cjs\");\n }\n\n return new URL(\"./worker.js\", import.meta.url);\n}\n\nexport class TinyCloudVfsBridge {\n private readonly worker: Worker;\n\n constructor(init: TinyCloudVfsWorkerInit) {\n const specifier = resolveWorkerSpecifier();\n this.worker = typeof specifier === \"string\"\n ? new Worker(specifier)\n : new Worker(specifier);\n\n const response = this.requestSync({ type: \"init\", init });\n if (!response.ok) {\n this.worker.terminate();\n throw createEIO(\"init\", \"/\", response.error.message);\n }\n }\n\n close(): void {\n void this.worker.terminate();\n }\n\n requestSync(request: WorkerRequest): WorkerResponse {\n const { port1, port2 } = new MessageChannel();\n const { buffer, view } = createWaitSignal();\n\n this.worker.postMessage(\n {\n request,\n replyPort: port1,\n waitBuffer: buffer,\n },\n [port1],\n );\n\n while (Atomics.load(view, 0) === 0) {\n Atomics.wait(view, 0, 0, WAIT_SLICE_MS);\n }\n\n const response = receiveMessageOnPort(port2)?.message as WorkerResponse | undefined;\n port2.close();\n if (!response) {\n throw createEIO(\"bridge\", \"/\", \"worker did not return a response\");\n }\n\n return response;\n }\n\n async requestAsync(request: WorkerRequest): Promise<WorkerResponse> {\n return this.requestSync(request);\n }\n}\n","const ERRNO: Record<string, number> = {\n EPERM: -1,\n ENOENT: -2,\n EIO: -5,\n EBADF: -9,\n EACCES: -13,\n EBUSY: -16,\n EEXIST: -17,\n ENOTDIR: -20,\n EISDIR: -21,\n EINVAL: -22,\n ENOTEMPTY: -39,\n EROFS: -30,\n};\n\nexport function createNodeError(\n code: string,\n message: string,\n syscall: string,\n path?: string,\n): NodeJS.ErrnoException {\n const error = new Error(message) as NodeJS.ErrnoException;\n error.code = code;\n error.errno = ERRNO[code] ?? -1;\n error.syscall = syscall;\n if (path) {\n error.path = path;\n }\n return error;\n}\n\nexport function createENOENT(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOENT\", `no such file or directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEISDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EISDIR\", `illegal operation on a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTDIR\", `not a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTEMPTY\", `directory not empty, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEEXIST(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EEXIST\", `file already exists, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEACCES(syscall: string, path: string, message = \"permission denied\"): NodeJS.ErrnoException {\n return createNodeError(\"EACCES\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEROFS(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EROFS\", `read-only file system, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEIO(syscall: string, path: string, message: string): NodeJS.ErrnoException {\n return createNodeError(\"EIO\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEBUSY(syscall: string, path: string, message = \"resource busy or locked\"): NodeJS.ErrnoException {\n return createNodeError(\"EBUSY\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEINVAL(syscall: string, path: string, message = \"invalid argument\"): NodeJS.ErrnoException {\n return createNodeError(\"EINVAL\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function fromWorkerError(error: { code: string; message: string; syscall?: string; path?: string }): NodeJS.ErrnoException {\n return createNodeError(\n error.code,\n error.message,\n error.syscall ?? \"vfs\",\n error.path,\n );\n}\n","import { Buffer } from \"node:buffer\";\nimport fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport type * as NodeFs from \"node:fs\";\nimport type * as NodeFsPromises from \"node:fs/promises\";\nimport { syncBuiltinESMExports } from \"node:module\";\nimport type { VirtualFileSystem } from \"@platformatic/vfs\";\nimport { fileURLToPath } from \"node:url\";\nimport { createNodeError } from \"./errors\";\n\ntype PathArg = string | Buffer | URL;\ntype WriteCallback = (error: NodeJS.ErrnoException | null) => void;\ntype MkdirCallback = (error: NodeJS.ErrnoException | null, path?: string) => void;\n\ninterface PatchableVirtualFileSystem extends VirtualFileSystem {\n mountPoint: string | null;\n mounted: boolean;\n shouldHandle(path: string): boolean;\n writeFileSync(path: string, data: unknown, options?: unknown): void;\n appendFileSync(path: string, data: unknown, options?: unknown): void;\n mkdirSync(path: string, options?: unknown): string | undefined;\n renameSync(oldPath: string, newPath: string): void;\n unlinkSync(path: string): void;\n rmdirSync(path: string, options?: unknown): void;\n promises: {\n writeFile(path: string, data: unknown, options?: unknown): Promise<void>;\n appendFile(path: string, data: unknown, options?: unknown): Promise<void>;\n mkdir(path: string, options?: unknown): Promise<string | undefined>;\n rename(oldPath: string, newPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rmdir(path: string, options?: unknown): Promise<void>;\n };\n [Symbol.dispose]?: () => void;\n}\n\ninterface OriginalFsMethods {\n writeFileSync: typeof NodeFs.writeFileSync;\n appendFileSync: typeof NodeFs.appendFileSync;\n mkdirSync: typeof NodeFs.mkdirSync;\n renameSync: typeof NodeFs.renameSync;\n unlinkSync: typeof NodeFs.unlinkSync;\n rmdirSync: typeof NodeFs.rmdirSync;\n writeFile: typeof NodeFs.writeFile;\n appendFile: typeof NodeFs.appendFile;\n mkdir: typeof NodeFs.mkdir;\n rename: typeof NodeFs.rename;\n unlink: typeof NodeFs.unlink;\n rmdir: typeof NodeFs.rmdir;\n}\n\ninterface OriginalPromiseMethods {\n writeFile: typeof NodeFsPromises.writeFile;\n appendFile: typeof NodeFsPromises.appendFile;\n mkdir: typeof NodeFsPromises.mkdir;\n rename: typeof NodeFsPromises.rename;\n unlink: typeof NodeFsPromises.unlink;\n rmdir: typeof NodeFsPromises.rmdir;\n}\n\nconst activeVfs = new Set<PatchableVirtualFileSystem>();\nconst mutableFs = fs as typeof NodeFs & { promises: typeof NodeFsPromises };\nconst mutableFsPromises = fsPromises as typeof NodeFsPromises;\n\nconst originalFsMethods: OriginalFsMethods = {\n writeFileSync: mutableFs.writeFileSync.bind(mutableFs),\n appendFileSync: mutableFs.appendFileSync.bind(mutableFs),\n mkdirSync: mutableFs.mkdirSync.bind(mutableFs),\n renameSync: mutableFs.renameSync.bind(mutableFs),\n unlinkSync: mutableFs.unlinkSync.bind(mutableFs),\n rmdirSync: mutableFs.rmdirSync.bind(mutableFs),\n writeFile: mutableFs.writeFile.bind(mutableFs),\n appendFile: mutableFs.appendFile.bind(mutableFs),\n mkdir: mutableFs.mkdir.bind(mutableFs),\n rename: mutableFs.rename.bind(mutableFs),\n unlink: mutableFs.unlink.bind(mutableFs),\n rmdir: mutableFs.rmdir.bind(mutableFs),\n};\n\nconst originalPromiseMethods: OriginalPromiseMethods = {\n writeFile: mutableFsPromises.writeFile.bind(mutableFsPromises),\n appendFile: mutableFsPromises.appendFile.bind(mutableFsPromises),\n mkdir: mutableFsPromises.mkdir.bind(mutableFsPromises),\n rename: mutableFsPromises.rename.bind(mutableFsPromises),\n unlink: mutableFsPromises.unlink.bind(mutableFsPromises),\n rmdir: mutableFsPromises.rmdir.bind(mutableFsPromises),\n};\n\nlet installed = false;\n\nfunction toPathString(path: unknown): string | null {\n if (typeof path === \"string\") {\n return path;\n }\n if (Buffer.isBuffer(path)) {\n return path.toString();\n }\n if (path instanceof URL) {\n return fileURLToPath(path);\n }\n return null;\n}\n\nfunction activeVfsBySpecificity(): PatchableVirtualFileSystem[] {\n return [...activeVfs].sort((left, right) => {\n return (right.mountPoint?.length ?? 0) - (left.mountPoint?.length ?? 0);\n });\n}\n\nfunction findMountedVfs(path: unknown): { vfs: PatchableVirtualFileSystem; path: string } | null {\n const normalizedPath = toPathString(path);\n if (!normalizedPath) {\n return null;\n }\n\n for (const vfs of activeVfsBySpecificity()) {\n if (vfs.mounted && vfs.shouldHandle(normalizedPath)) {\n return { vfs, path: normalizedPath };\n }\n }\n\n return null;\n}\n\nfunction findMountedVfsForPaths(paths: unknown[], syscall: string): { vfs: PatchableVirtualFileSystem; paths: string[] } | null {\n let selected: PatchableVirtualFileSystem | null = null;\n const normalizedPaths: string[] = [];\n\n for (const path of paths) {\n const normalizedPath = toPathString(path);\n if (!normalizedPath) {\n normalizedPaths.push(String(path));\n continue;\n }\n\n normalizedPaths.push(normalizedPath);\n const match = findMountedVfs(normalizedPath);\n if (!match) {\n continue;\n }\n\n if (selected && selected !== match.vfs) {\n throw createNodeError(\n \"EXDEV\",\n `cross-device link not permitted, ${syscall} '${normalizedPaths.join(\"' -> '\")}'`,\n syscall,\n normalizedPath,\n );\n }\n\n selected = match.vfs;\n }\n\n if (!selected) {\n return null;\n }\n\n return { vfs: selected, paths: normalizedPaths };\n}\n\nfunction withCallback<T>(promise: Promise<T>, callback: (error: NodeJS.ErrnoException | null, result?: T) => void): void {\n promise.then(\n (result) => process.nextTick(callback, null, result),\n (error) => process.nextTick(callback, error as NodeJS.ErrnoException),\n );\n}\n\nfunction installFsWritePatches(): void {\n if (installed) {\n return;\n }\n\n mutableFs.writeFileSync = ((file: PathArg, data: unknown, options?: unknown) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.writeFileSync(file, data as never, options as never);\n }\n return match.vfs.writeFileSync(match.path, data, options);\n }) as typeof NodeFs.writeFileSync;\n\n mutableFs.appendFileSync = ((file: PathArg, data: unknown, options?: unknown) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.appendFileSync(file, data as never, options as never);\n }\n return match.vfs.appendFileSync(match.path, data, options);\n }) as typeof NodeFs.appendFileSync;\n\n mutableFs.mkdirSync = ((path: PathArg, options?: unknown) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.mkdirSync(path, options as never);\n }\n return match.vfs.mkdirSync(match.path, options);\n }) as typeof NodeFs.mkdirSync;\n\n mutableFs.renameSync = ((oldPath: PathArg, newPath: PathArg) => {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalFsMethods.renameSync(oldPath, newPath);\n }\n const [normalizedOld, normalizedNew] = match.paths;\n return match.vfs.renameSync(normalizedOld, normalizedNew);\n }) as typeof NodeFs.renameSync;\n\n mutableFs.unlinkSync = ((path: PathArg) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.unlinkSync(path);\n }\n return match.vfs.unlinkSync(match.path);\n }) as typeof NodeFs.unlinkSync;\n\n mutableFs.rmdirSync = ((path: PathArg, options?: unknown) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.rmdirSync(path, options as never);\n }\n return match.vfs.rmdirSync(match.path, options);\n }) as typeof NodeFs.rmdirSync;\n\n mutableFs.writeFile = ((file: PathArg, data: unknown, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.writeFile(file, data as never, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.writeFile(file, data as never, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.writeFile(match.path, data, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.writeFile;\n\n mutableFs.appendFile = ((file: PathArg, data: unknown, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.appendFile(file, data as never, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.appendFile(file, data as never, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.appendFile(match.path, data, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.appendFile;\n\n mutableFs.mkdir = ((path: PathArg, options?: unknown, callback?: MkdirCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.mkdir(path, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.mkdir(path, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.mkdir(match.path, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.mkdir;\n\n mutableFs.rename = ((oldPath: PathArg, newPath: PathArg, callback?: WriteCallback) => {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalFsMethods.rename(oldPath, newPath, callback as never);\n }\n if (typeof callback !== \"function\") {\n return originalFsMethods.rename(oldPath, newPath, callback as never);\n }\n\n const [normalizedOld, normalizedNew] = match.paths;\n withCallback(match.vfs.promises.rename(normalizedOld, normalizedNew), callback);\n }) as typeof NodeFs.rename;\n\n mutableFs.unlink = ((path: PathArg, callback?: WriteCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.unlink(path, callback as never);\n }\n if (typeof callback !== \"function\") {\n return originalFsMethods.unlink(path, callback as never);\n }\n\n withCallback(match.vfs.promises.unlink(match.path), callback);\n }) as typeof NodeFs.unlink;\n\n mutableFs.rmdir = ((path: PathArg, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.rmdir(path, options as never, callback as never);\n }\n\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.rmdir(path, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.rmdir(match.path, typeof options === \"function\" ? undefined : options), resolvedCallback);\n }) as typeof NodeFs.rmdir;\n\n const promisePatches: OriginalPromiseMethods = {\n async writeFile(file: PathArg, data: unknown, options?: unknown) {\n const match = findMountedVfs(file);\n if (!match) {\n return originalPromiseMethods.writeFile(file, data as never, options as never);\n }\n return match.vfs.promises.writeFile(match.path, data, options);\n },\n\n async appendFile(file: PathArg, data: unknown, options?: unknown) {\n const match = findMountedVfs(file);\n if (!match) {\n return originalPromiseMethods.appendFile(file, data as never, options as never);\n }\n return match.vfs.promises.appendFile(match.path, data, options);\n },\n\n async mkdir(path: PathArg, options?: unknown) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.mkdir(path, options as never);\n }\n return match.vfs.promises.mkdir(match.path, options);\n },\n\n async rename(oldPath: PathArg, newPath: PathArg) {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalPromiseMethods.rename(oldPath, newPath);\n }\n const [normalizedOld, normalizedNew] = match.paths;\n return match.vfs.promises.rename(normalizedOld, normalizedNew);\n },\n\n async unlink(path: PathArg) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.unlink(path);\n }\n return match.vfs.promises.unlink(match.path);\n },\n\n async rmdir(path: PathArg, options?: unknown) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.rmdir(path, options as never);\n }\n return match.vfs.promises.rmdir(match.path, options);\n },\n };\n\n mutableFs.promises.writeFile = promisePatches.writeFile;\n mutableFs.promises.appendFile = promisePatches.appendFile;\n mutableFs.promises.mkdir = promisePatches.mkdir;\n mutableFs.promises.rename = promisePatches.rename;\n mutableFs.promises.unlink = promisePatches.unlink;\n mutableFs.promises.rmdir = promisePatches.rmdir;\n\n mutableFsPromises.writeFile = promisePatches.writeFile;\n mutableFsPromises.appendFile = promisePatches.appendFile;\n mutableFsPromises.mkdir = promisePatches.mkdir;\n mutableFsPromises.rename = promisePatches.rename;\n mutableFsPromises.unlink = promisePatches.unlink;\n mutableFsPromises.rmdir = promisePatches.rmdir;\n\n syncBuiltinESMExports();\n installed = true;\n}\n\nfunction uninstallFsWritePatches(): void {\n if (!installed || activeVfs.size > 0) {\n return;\n }\n\n mutableFs.writeFileSync = originalFsMethods.writeFileSync;\n mutableFs.appendFileSync = originalFsMethods.appendFileSync;\n mutableFs.mkdirSync = originalFsMethods.mkdirSync;\n mutableFs.renameSync = originalFsMethods.renameSync;\n mutableFs.unlinkSync = originalFsMethods.unlinkSync;\n mutableFs.rmdirSync = originalFsMethods.rmdirSync;\n mutableFs.writeFile = originalFsMethods.writeFile;\n mutableFs.appendFile = originalFsMethods.appendFile;\n mutableFs.mkdir = originalFsMethods.mkdir;\n mutableFs.rename = originalFsMethods.rename;\n mutableFs.unlink = originalFsMethods.unlink;\n mutableFs.rmdir = originalFsMethods.rmdir;\n\n mutableFs.promises.writeFile = originalPromiseMethods.writeFile;\n mutableFs.promises.appendFile = originalPromiseMethods.appendFile;\n mutableFs.promises.mkdir = originalPromiseMethods.mkdir;\n mutableFs.promises.rename = originalPromiseMethods.rename;\n mutableFs.promises.unlink = originalPromiseMethods.unlink;\n mutableFs.promises.rmdir = originalPromiseMethods.rmdir;\n\n mutableFsPromises.writeFile = originalPromiseMethods.writeFile;\n mutableFsPromises.appendFile = originalPromiseMethods.appendFile;\n mutableFsPromises.mkdir = originalPromiseMethods.mkdir;\n mutableFsPromises.rename = originalPromiseMethods.rename;\n mutableFsPromises.unlink = originalPromiseMethods.unlink;\n mutableFsPromises.rmdir = originalPromiseMethods.rmdir;\n\n syncBuiltinESMExports();\n installed = false;\n}\n\nfunction registerMountedVfs(vfs: PatchableVirtualFileSystem): void {\n activeVfs.add(vfs);\n installFsWritePatches();\n}\n\nfunction deregisterMountedVfs(vfs: PatchableVirtualFileSystem): void {\n activeVfs.delete(vfs);\n uninstallFsWritePatches();\n}\n\nexport function wrapVfsWithFsWritePatches(vfs: VirtualFileSystem): VirtualFileSystem {\n const patchableVfs = vfs as PatchableVirtualFileSystem;\n const originalMount = vfs.mount.bind(vfs);\n const originalUnmount = vfs.unmount.bind(vfs);\n const originalDispose = patchableVfs[Symbol.dispose]?.bind(vfs);\n let registered = false;\n\n patchableVfs.mount = ((prefix: string) => {\n const mounted = originalMount(prefix);\n if (!registered) {\n registerMountedVfs(patchableVfs);\n registered = true;\n }\n return mounted;\n }) as typeof vfs.mount;\n\n patchableVfs.unmount = (() => {\n if (registered) {\n deregisterMountedVfs(patchableVfs);\n registered = false;\n }\n return originalUnmount();\n }) as typeof vfs.unmount;\n\n if (originalDispose) {\n patchableVfs[Symbol.dispose] = (() => {\n if (registered) {\n deregisterMountedVfs(patchableVfs);\n registered = false;\n }\n return originalDispose();\n }) as typeof patchableVfs[typeof Symbol.dispose];\n }\n\n return patchableVfs;\n}\n","import { posix as pathPosix } from \"node:path\";\n\nexport const INTERNAL_META_PREFIX = \".tcvfs-meta\";\n\nexport function normalizeVfsPath(inputPath: string): string {\n const normalized = pathPosix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n const absolute = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n return absolute;\n}\n\nexport function toLogicalPath(inputPath: string): string {\n const normalized = normalizeVfsPath(inputPath);\n\n if (normalized.includes(\"\\0\")) {\n throw new Error(\"invalid path\");\n }\n\n if (normalized === \"/\") {\n return \"\";\n }\n\n const logical = normalized.slice(1);\n if (\n logical === INTERNAL_META_PREFIX ||\n logical.startsWith(`${INTERNAL_META_PREFIX}/`) ||\n logical.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\"path escapes virtual root\");\n }\n\n return logical;\n}\n\nexport function normalizeStoragePrefix(prefix?: string): string {\n if (!prefix) {\n return \"\";\n }\n\n return prefix\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nexport function joinStoragePath(...parts: Array<string | undefined>): string {\n const cleaned = parts\n .filter((part): part is string => Boolean(part))\n .map((part) => normalizeStoragePrefix(part));\n\n return cleaned.filter(Boolean).join(\"/\");\n}\n\nexport function dirnameOf(logicalPath: string): string {\n if (!logicalPath) {\n return \"\";\n }\n\n const dir = pathPosix.dirname(`/${logicalPath}`);\n return dir === \"/\" ? \"\" : dir.slice(1);\n}\n\nexport function basenameOf(logicalPath: string): string {\n return pathPosix.basename(logicalPath ? `/${logicalPath}` : \"/\");\n}\n","import { INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix } from \"./pathing\";\nimport type { TinyCloudVfsFileEnvelope, TinyCloudVfsMetadata } from \"./types\";\n\nexport function dataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, logicalPath);\n}\n\nexport function metadataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function metadataPrefix(storageRoot: string, logicalPath = \"\"): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function encodeEnvelope(content: Buffer): TinyCloudVfsFileEnvelope {\n return {\n version: 1,\n encoding: \"base64\",\n data: content.toString(\"base64\"),\n };\n}\n\nfunction isEnvelopeShape(value: unknown): value is TinyCloudVfsFileEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as TinyCloudVfsFileEnvelope).version === 1 &&\n (value as TinyCloudVfsFileEnvelope).encoding === \"base64\" &&\n typeof (value as TinyCloudVfsFileEnvelope).data === \"string\"\n );\n}\n\nexport function encodeFileValue(content: Buffer): string | TinyCloudVfsFileEnvelope {\n const utf8 = content.toString(\"utf8\");\n if (Buffer.from(utf8, \"utf8\").equals(content)) {\n return utf8;\n }\n\n return encodeEnvelope(content);\n}\n\nexport function decodeEnvelope(value: unknown): Buffer {\n if (isEnvelopeShape(value)) {\n return Buffer.from((value as TinyCloudVfsFileEnvelope).data, \"base64\");\n }\n\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isEnvelopeShape(parsed)) {\n return Buffer.from(parsed.data, \"base64\");\n }\n } catch {\n // Plain text payloads are expected and should fall through.\n }\n\n return Buffer.from(value, \"utf8\");\n }\n\n throw new Error(\"unsupported file payload\");\n}\n\nfunction isMetadataShape(value: unknown): value is TinyCloudVfsMetadata {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (((value as TinyCloudVfsMetadata).kind === \"file\") || ((value as TinyCloudVfsMetadata).kind === \"directory\")) &&\n typeof (value as TinyCloudVfsMetadata).size === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mode === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).ctimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mtimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).birthtimeMs === \"number\"\n );\n}\n\nexport function decodeMetadata(value: unknown): TinyCloudVfsMetadata {\n if (isMetadataShape(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown;\n if (isMetadataShape(parsed)) {\n return parsed;\n }\n }\n\n throw new Error(\"unsupported metadata payload\");\n}\n\nexport function nowMetadata(kind: \"file\" | \"directory\", size: number, mode: number, existing?: TinyCloudVfsMetadata): TinyCloudVfsMetadata {\n const now = Date.now();\n return {\n kind,\n size,\n mode,\n ctimeMs: now,\n mtimeMs: now,\n birthtimeMs: existing?.birthtimeMs ?? now,\n };\n}\n\nexport function normalizeMode(kind: \"file\" | \"directory\", mode?: number): number {\n if (typeof mode === \"number\" && Number.isFinite(mode)) {\n return mode;\n }\n\n return kind === \"directory\" ? 0o755 : 0o644;\n}\n\nexport function stripStoragePrefix(fullKey: string, prefix: string): string {\n const normalizedPrefix = normalizeStoragePrefix(prefix);\n if (!normalizedPrefix) {\n return fullKey.replace(/^\\/+/, \"\");\n }\n\n const withSlash = `${normalizedPrefix}/`;\n if (fullKey === normalizedPrefix) {\n return \"\";\n }\n\n if (fullKey.startsWith(withSlash)) {\n return fullKey.slice(withSlash.length);\n }\n\n return fullKey;\n}\n"],"mappings":";AAAA,SAAS,UAAAA,eAAc;AACvB,SAAS,iBAAiB,cAAc;;;ACDxC,SAAS,gBAAgB,QAAQ,4BAA4B;AAC7D,SAAS,YAAY;;;ACDrB,IAAM,QAAgC;AAAA,EACpC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AACT;AAEO,SAAS,gBACd,MACA,SACA,SACA,MACuB;AACvB,QAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,QAAM,OAAO;AACb,QAAM,QAAQ,MAAM,IAAI,KAAK;AAC7B,QAAM,UAAU;AAChB,MAAI,MAAM;AACR,UAAM,OAAO;AAAA,EACf;AACA,SAAO;AACT;AAMO,SAAS,aAAa,SAAiB,MAAqC;AACjF,SAAO,gBAAgB,UAAU,qCAAqC,OAAO,KAAK,IAAI,KAAK,SAAS,IAAI;AAC1G;AAkBO,SAAS,YAAY,SAAiB,MAAqC;AAChF,SAAO,gBAAgB,SAAS,0BAA0B,OAAO,KAAK,IAAI,KAAK,SAAS,IAAI;AAC9F;AAEO,SAAS,UAAU,SAAiB,MAAc,SAAwC;AAC/F,SAAO,gBAAgB,OAAO,GAAG,OAAO,KAAK,OAAO,KAAK,IAAI,KAAK,SAAS,IAAI;AACjF;AAUO,SAAS,gBAAgB,OAAkG;AAChI,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,WAAW;AAAA,IACjB,MAAM;AAAA,EACR;AACF;;;ADzEA,IAAM,gBAAgB;AAEtB,SAAS,mBAAoE;AAC3E,QAAM,SAAS,IAAI,kBAAkB,WAAW,iBAAiB;AACjE,SAAO;AAAA,IACL;AAAA,IACA,MAAM,IAAI,WAAW,MAAM;AAAA,EAC7B;AACF;AAEA,SAAS,yBAAuC;AAC9C,MAAI,OAAO,cAAc,aAAa;AACpC,WAAO,KAAK,WAAW,YAAY;AAAA,EACrC;AAEA,SAAO,IAAI,IAAI,eAAe,YAAY,GAAG;AAC/C;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb;AAAA,EAEjB,YAAY,MAA8B;AACxC,UAAM,YAAY,uBAAuB;AACzC,SAAK,SAAS,OAAO,cAAc,WAC/B,IAAI,OAAO,SAAS,IACpB,IAAI,OAAO,SAAS;AAExB,UAAM,WAAW,KAAK,YAAY,EAAE,MAAM,QAAQ,KAAK,CAAC;AACxD,QAAI,CAAC,SAAS,IAAI;AAChB,WAAK,OAAO,UAAU;AACtB,YAAM,UAAU,QAAQ,KAAK,SAAS,MAAM,OAAO;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,KAAK,OAAO,UAAU;AAAA,EAC7B;AAAA,EAEA,YAAY,SAAwC;AAClD,UAAM,EAAE,OAAO,MAAM,IAAI,IAAI,eAAe;AAC5C,UAAM,EAAE,QAAQ,KAAK,IAAI,iBAAiB;AAE1C,SAAK,OAAO;AAAA,MACV;AAAA,QACE;AAAA,QACA,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,CAAC,KAAK;AAAA,IACR;AAEA,WAAO,QAAQ,KAAK,MAAM,CAAC,MAAM,GAAG;AAClC,cAAQ,KAAK,MAAM,GAAG,GAAG,aAAa;AAAA,IACxC;AAEA,UAAM,WAAW,qBAAqB,KAAK,GAAG;AAC9C,UAAM,MAAM;AACZ,QAAI,CAAC,UAAU;AACb,YAAM,UAAU,UAAU,KAAK,kCAAkC;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,SAAiD;AAClE,WAAO,KAAK,YAAY,OAAO;AAAA,EACjC;AACF;;;AExEA,SAAS,UAAAC,eAAc;AACvB,OAAO,QAAQ;AACf,OAAO,gBAAgB;AAGvB,SAAS,6BAA6B;AAEtC,SAAS,qBAAqB;AAoD9B,IAAM,YAAY,oBAAI,IAAgC;AACtD,IAAM,YAAY;AAClB,IAAM,oBAAoB;AAE1B,IAAM,oBAAuC;AAAA,EAC3C,eAAe,UAAU,cAAc,KAAK,SAAS;AAAA,EACrD,gBAAgB,UAAU,eAAe,KAAK,SAAS;AAAA,EACvD,WAAW,UAAU,UAAU,KAAK,SAAS;AAAA,EAC7C,YAAY,UAAU,WAAW,KAAK,SAAS;AAAA,EAC/C,YAAY,UAAU,WAAW,KAAK,SAAS;AAAA,EAC/C,WAAW,UAAU,UAAU,KAAK,SAAS;AAAA,EAC7C,WAAW,UAAU,UAAU,KAAK,SAAS;AAAA,EAC7C,YAAY,UAAU,WAAW,KAAK,SAAS;AAAA,EAC/C,OAAO,UAAU,MAAM,KAAK,SAAS;AAAA,EACrC,QAAQ,UAAU,OAAO,KAAK,SAAS;AAAA,EACvC,QAAQ,UAAU,OAAO,KAAK,SAAS;AAAA,EACvC,OAAO,UAAU,MAAM,KAAK,SAAS;AACvC;AAEA,IAAM,yBAAiD;AAAA,EACrD,WAAW,kBAAkB,UAAU,KAAK,iBAAiB;AAAA,EAC7D,YAAY,kBAAkB,WAAW,KAAK,iBAAiB;AAAA,EAC/D,OAAO,kBAAkB,MAAM,KAAK,iBAAiB;AAAA,EACrD,QAAQ,kBAAkB,OAAO,KAAK,iBAAiB;AAAA,EACvD,QAAQ,kBAAkB,OAAO,KAAK,iBAAiB;AAAA,EACvD,OAAO,kBAAkB,MAAM,KAAK,iBAAiB;AACvD;AAEA,IAAI,YAAY;AAEhB,SAAS,aAAa,MAA8B;AAClD,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAIC,QAAO,SAAS,IAAI,GAAG;AACzB,WAAO,KAAK,SAAS;AAAA,EACvB;AACA,MAAI,gBAAgB,KAAK;AACvB,WAAO,cAAc,IAAI;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,yBAAuD;AAC9D,SAAO,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,UAAU;AAC1C,YAAQ,MAAM,YAAY,UAAU,MAAM,KAAK,YAAY,UAAU;AAAA,EACvE,CAAC;AACH;AAEA,SAAS,eAAe,MAAyE;AAC/F,QAAM,iBAAiB,aAAa,IAAI;AACxC,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,aAAW,OAAO,uBAAuB,GAAG;AAC1C,QAAI,IAAI,WAAW,IAAI,aAAa,cAAc,GAAG;AACnD,aAAO,EAAE,KAAK,MAAM,eAAe;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAkB,SAA8E;AAC9H,MAAI,WAA8C;AAClD,QAAM,kBAA4B,CAAC;AAEnC,aAAW,QAAQ,OAAO;AACxB,UAAM,iBAAiB,aAAa,IAAI;AACxC,QAAI,CAAC,gBAAgB;AACnB,sBAAgB,KAAK,OAAO,IAAI,CAAC;AACjC;AAAA,IACF;AAEA,oBAAgB,KAAK,cAAc;AACnC,UAAM,QAAQ,eAAe,cAAc;AAC3C,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,QAAI,YAAY,aAAa,MAAM,KAAK;AACtC,YAAM;AAAA,QACJ;AAAA,QACA,oCAAoC,OAAO,KAAK,gBAAgB,KAAK,QAAQ,CAAC;AAAA,QAC9E;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,eAAW,MAAM;AAAA,EACnB;AAEA,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,KAAK,UAAU,OAAO,gBAAgB;AACjD;AAEA,SAAS,aAAgB,SAAqB,UAA2E;AACvH,UAAQ;AAAA,IACN,CAAC,WAAW,QAAQ,SAAS,UAAU,MAAM,MAAM;AAAA,IACnD,CAAC,UAAU,QAAQ,SAAS,UAAU,KAA8B;AAAA,EACtE;AACF;AAEA,SAAS,wBAA8B;AACrC,MAAI,WAAW;AACb;AAAA,EACF;AAEA,YAAU,iBAAiB,CAAC,MAAe,MAAe,YAAsB;AAC9E,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,cAAc,MAAM,MAAe,OAAgB;AAAA,IAC9E;AACA,WAAO,MAAM,IAAI,cAAc,MAAM,MAAM,MAAM,OAAO;AAAA,EAC1D;AAEA,YAAU,kBAAkB,CAAC,MAAe,MAAe,YAAsB;AAC/E,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,eAAe,MAAM,MAAe,OAAgB;AAAA,IAC/E;AACA,WAAO,MAAM,IAAI,eAAe,MAAM,MAAM,MAAM,OAAO;AAAA,EAC3D;AAEA,YAAU,aAAa,CAAC,MAAe,YAAsB;AAC3D,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,UAAU,MAAM,OAAgB;AAAA,IAC3D;AACA,WAAO,MAAM,IAAI,UAAU,MAAM,MAAM,OAAO;AAAA,EAChD;AAEA,YAAU,cAAc,CAAC,SAAkB,YAAqB;AAC9D,UAAM,QAAQ,uBAAuB,CAAC,SAAS,OAAO,GAAG,QAAQ;AACjE,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,WAAW,SAAS,OAAO;AAAA,IACtD;AACA,UAAM,CAAC,eAAe,aAAa,IAAI,MAAM;AAC7C,WAAO,MAAM,IAAI,WAAW,eAAe,aAAa;AAAA,EAC1D;AAEA,YAAU,cAAc,CAAC,SAAkB;AACzC,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,WAAW,IAAI;AAAA,IAC1C;AACA,WAAO,MAAM,IAAI,WAAW,MAAM,IAAI;AAAA,EACxC;AAEA,YAAU,aAAa,CAAC,MAAe,YAAsB;AAC3D,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,UAAU,MAAM,OAAgB;AAAA,IAC3D;AACA,WAAO,MAAM,IAAI,UAAU,MAAM,MAAM,OAAO;AAAA,EAChD;AAEA,YAAU,aAAa,CAAC,MAAe,MAAe,SAAmB,aAA6B;AACpG,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,UAAU,MAAM,MAAe,SAAkB,QAAiB;AAAA,IAC7F;AAEA,UAAM,kBAAkB,OAAO,YAAY,aAAa,SAAY;AACpE,UAAM,mBAAmB,OAAO,YAAY,aAAa,UAAU;AACnE,QAAI,OAAO,qBAAqB,YAAY;AAC1C,aAAO,kBAAkB,UAAU,MAAM,MAAe,SAAkB,QAAiB;AAAA,IAC7F;AAEA,iBAAa,MAAM,IAAI,SAAS,UAAU,MAAM,MAAM,MAAM,eAAe,GAAG,gBAAgB;AAAA,EAChG;AAEA,YAAU,cAAc,CAAC,MAAe,MAAe,SAAmB,aAA6B;AACrG,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,WAAW,MAAM,MAAe,SAAkB,QAAiB;AAAA,IAC9F;AAEA,UAAM,kBAAkB,OAAO,YAAY,aAAa,SAAY;AACpE,UAAM,mBAAmB,OAAO,YAAY,aAAa,UAAU;AACnE,QAAI,OAAO,qBAAqB,YAAY;AAC1C,aAAO,kBAAkB,WAAW,MAAM,MAAe,SAAkB,QAAiB;AAAA,IAC9F;AAEA,iBAAa,MAAM,IAAI,SAAS,WAAW,MAAM,MAAM,MAAM,eAAe,GAAG,gBAAgB;AAAA,EACjG;AAEA,YAAU,SAAS,CAAC,MAAe,SAAmB,aAA6B;AACjF,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,MAAM,MAAM,SAAkB,QAAiB;AAAA,IAC1E;AAEA,UAAM,kBAAkB,OAAO,YAAY,aAAa,SAAY;AACpE,UAAM,mBAAmB,OAAO,YAAY,aAAa,UAAU;AACnE,QAAI,OAAO,qBAAqB,YAAY;AAC1C,aAAO,kBAAkB,MAAM,MAAM,SAAkB,QAAiB;AAAA,IAC1E;AAEA,iBAAa,MAAM,IAAI,SAAS,MAAM,MAAM,MAAM,eAAe,GAAG,gBAAgB;AAAA,EACtF;AAEA,YAAU,UAAU,CAAC,SAAkB,SAAkB,aAA6B;AACpF,UAAM,QAAQ,uBAAuB,CAAC,SAAS,OAAO,GAAG,QAAQ;AACjE,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,OAAO,SAAS,SAAS,QAAiB;AAAA,IACrE;AACA,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,kBAAkB,OAAO,SAAS,SAAS,QAAiB;AAAA,IACrE;AAEA,UAAM,CAAC,eAAe,aAAa,IAAI,MAAM;AAC7C,iBAAa,MAAM,IAAI,SAAS,OAAO,eAAe,aAAa,GAAG,QAAQ;AAAA,EAChF;AAEA,YAAU,UAAU,CAAC,MAAe,aAA6B;AAC/D,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,OAAO,MAAM,QAAiB;AAAA,IACzD;AACA,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,kBAAkB,OAAO,MAAM,QAAiB;AAAA,IACzD;AAEA,iBAAa,MAAM,IAAI,SAAS,OAAO,MAAM,IAAI,GAAG,QAAQ;AAAA,EAC9D;AAEA,YAAU,SAAS,CAAC,MAAe,SAAmB,aAA6B;AACjF,UAAM,QAAQ,eAAe,IAAI;AACjC,QAAI,CAAC,OAAO;AACV,aAAO,kBAAkB,MAAM,MAAM,SAAkB,QAAiB;AAAA,IAC1E;AAEA,UAAM,mBAAmB,OAAO,YAAY,aAAa,UAAU;AACnE,QAAI,OAAO,qBAAqB,YAAY;AAC1C,aAAO,kBAAkB,MAAM,MAAM,SAAkB,QAAiB;AAAA,IAC1E;AAEA,iBAAa,MAAM,IAAI,SAAS,MAAM,MAAM,MAAM,OAAO,YAAY,aAAa,SAAY,OAAO,GAAG,gBAAgB;AAAA,EAC1H;AAEA,QAAM,iBAAyC;AAAA,IAC7C,MAAM,UAAU,MAAe,MAAe,SAAmB;AAC/D,YAAM,QAAQ,eAAe,IAAI;AACjC,UAAI,CAAC,OAAO;AACV,eAAO,uBAAuB,UAAU,MAAM,MAAe,OAAgB;AAAA,MAC/E;AACA,aAAO,MAAM,IAAI,SAAS,UAAU,MAAM,MAAM,MAAM,OAAO;AAAA,IAC/D;AAAA,IAEA,MAAM,WAAW,MAAe,MAAe,SAAmB;AAChE,YAAM,QAAQ,eAAe,IAAI;AACjC,UAAI,CAAC,OAAO;AACV,eAAO,uBAAuB,WAAW,MAAM,MAAe,OAAgB;AAAA,MAChF;AACA,aAAO,MAAM,IAAI,SAAS,WAAW,MAAM,MAAM,MAAM,OAAO;AAAA,IAChE;AAAA,IAEA,MAAM,MAAM,MAAe,SAAmB;AAC5C,YAAM,QAAQ,eAAe,IAAI;AACjC,UAAI,CAAC,OAAO;AACV,eAAO,uBAAuB,MAAM,MAAM,OAAgB;AAAA,MAC5D;AACA,aAAO,MAAM,IAAI,SAAS,MAAM,MAAM,MAAM,OAAO;AAAA,IACrD;AAAA,IAEA,MAAM,OAAO,SAAkB,SAAkB;AAC/C,YAAM,QAAQ,uBAAuB,CAAC,SAAS,OAAO,GAAG,QAAQ;AACjE,UAAI,CAAC,OAAO;AACV,eAAO,uBAAuB,OAAO,SAAS,OAAO;AAAA,MACvD;AACA,YAAM,CAAC,eAAe,aAAa,IAAI,MAAM;AAC7C,aAAO,MAAM,IAAI,SAAS,OAAO,eAAe,aAAa;AAAA,IAC/D;AAAA,IAEA,MAAM,OAAO,MAAe;AAC1B,YAAM,QAAQ,eAAe,IAAI;AACjC,UAAI,CAAC,OAAO;AACV,eAAO,uBAAuB,OAAO,IAAI;AAAA,MAC3C;AACA,aAAO,MAAM,IAAI,SAAS,OAAO,MAAM,IAAI;AAAA,IAC7C;AAAA,IAEA,MAAM,MAAM,MAAe,SAAmB;AAC5C,YAAM,QAAQ,eAAe,IAAI;AACjC,UAAI,CAAC,OAAO;AACV,eAAO,uBAAuB,MAAM,MAAM,OAAgB;AAAA,MAC5D;AACA,aAAO,MAAM,IAAI,SAAS,MAAM,MAAM,MAAM,OAAO;AAAA,IACrD;AAAA,EACF;AAEA,YAAU,SAAS,YAAY,eAAe;AAC9C,YAAU,SAAS,aAAa,eAAe;AAC/C,YAAU,SAAS,QAAQ,eAAe;AAC1C,YAAU,SAAS,SAAS,eAAe;AAC3C,YAAU,SAAS,SAAS,eAAe;AAC3C,YAAU,SAAS,QAAQ,eAAe;AAE1C,oBAAkB,YAAY,eAAe;AAC7C,oBAAkB,aAAa,eAAe;AAC9C,oBAAkB,QAAQ,eAAe;AACzC,oBAAkB,SAAS,eAAe;AAC1C,oBAAkB,SAAS,eAAe;AAC1C,oBAAkB,QAAQ,eAAe;AAEzC,wBAAsB;AACtB,cAAY;AACd;AAEA,SAAS,0BAAgC;AACvC,MAAI,CAAC,aAAa,UAAU,OAAO,GAAG;AACpC;AAAA,EACF;AAEA,YAAU,gBAAgB,kBAAkB;AAC5C,YAAU,iBAAiB,kBAAkB;AAC7C,YAAU,YAAY,kBAAkB;AACxC,YAAU,aAAa,kBAAkB;AACzC,YAAU,aAAa,kBAAkB;AACzC,YAAU,YAAY,kBAAkB;AACxC,YAAU,YAAY,kBAAkB;AACxC,YAAU,aAAa,kBAAkB;AACzC,YAAU,QAAQ,kBAAkB;AACpC,YAAU,SAAS,kBAAkB;AACrC,YAAU,SAAS,kBAAkB;AACrC,YAAU,QAAQ,kBAAkB;AAEpC,YAAU,SAAS,YAAY,uBAAuB;AACtD,YAAU,SAAS,aAAa,uBAAuB;AACvD,YAAU,SAAS,QAAQ,uBAAuB;AAClD,YAAU,SAAS,SAAS,uBAAuB;AACnD,YAAU,SAAS,SAAS,uBAAuB;AACnD,YAAU,SAAS,QAAQ,uBAAuB;AAElD,oBAAkB,YAAY,uBAAuB;AACrD,oBAAkB,aAAa,uBAAuB;AACtD,oBAAkB,QAAQ,uBAAuB;AACjD,oBAAkB,SAAS,uBAAuB;AAClD,oBAAkB,SAAS,uBAAuB;AAClD,oBAAkB,QAAQ,uBAAuB;AAEjD,wBAAsB;AACtB,cAAY;AACd;AAEA,SAAS,mBAAmB,KAAuC;AACjE,YAAU,IAAI,GAAG;AACjB,wBAAsB;AACxB;AAEA,SAAS,qBAAqB,KAAuC;AACnE,YAAU,OAAO,GAAG;AACpB,0BAAwB;AAC1B;AAEO,SAAS,0BAA0B,KAA2C;AACnF,QAAM,eAAe;AACrB,QAAM,gBAAgB,IAAI,MAAM,KAAK,GAAG;AACxC,QAAM,kBAAkB,IAAI,QAAQ,KAAK,GAAG;AAC5C,QAAM,kBAAkB,aAAa,OAAO,OAAO,GAAG,KAAK,GAAG;AAC9D,MAAI,aAAa;AAEjB,eAAa,SAAS,CAAC,WAAmB;AACxC,UAAM,UAAU,cAAc,MAAM;AACpC,QAAI,CAAC,YAAY;AACf,yBAAmB,YAAY;AAC/B,mBAAa;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAEA,eAAa,WAAW,MAAM;AAC5B,QAAI,YAAY;AACd,2BAAqB,YAAY;AACjC,mBAAa;AAAA,IACf;AACA,WAAO,gBAAgB;AAAA,EACzB;AAEA,MAAI,iBAAiB;AACnB,iBAAa,OAAO,OAAO,KAAK,MAAM;AACpC,UAAI,YAAY;AACd,6BAAqB,YAAY;AACjC,qBAAa;AAAA,MACf;AACA,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;;;ACtcA,SAAS,SAAS,iBAAiB;AAI5B,SAAS,iBAAiB,WAA2B;AAC1D,QAAM,aAAa,UAAU,UAAU,UAAU,QAAQ,OAAO,GAAG,CAAC;AACpE,QAAM,WAAW,WAAW,WAAW,GAAG,IAAI,aAAa,IAAI,UAAU;AACzE,SAAO;AACT;;;AC+FO,SAAS,cAAc,MAA4B,MAAuB;AAC/E,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,GAAG;AACrD,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,cAAc,MAAQ;AACxC;;;ALpFA,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,qBAAqB;AAE3B,SAAS,YAAY,UAAgC;AACnD,QAAM,OAAO,SAAS,SAAS,cAC1B,SAAS,OAAO,UAChB,SAAS,OAAO;AAErB,SAAO;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,KAAK,QAAQ,SAAS,KAAK;AAAA,IAC3B,KAAK,QAAQ,SAAS,KAAK;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM,SAAS,SAAS,cAAc,qBAAqB,SAAS;AAAA,IACpE,QAAQ,SAAS,SAAS,cAAc,IAAI,KAAK,KAAK,SAAS,OAAO,GAAG;AAAA,IACzE,SAAS,SAAS;AAAA,IAClB,SAAS,SAAS;AAAA,IAClB,SAAS,SAAS;AAAA,IAClB,aAAa,SAAS;AAAA,IACtB,OAAO,IAAI,KAAK,SAAS,OAAO;AAAA,IAChC,OAAO,IAAI,KAAK,SAAS,OAAO;AAAA,IAChC,OAAO,IAAI,KAAK,SAAS,OAAO;AAAA,IAChC,WAAW,IAAI,KAAK,SAAS,WAAW;AAAA,IACxC,QAAQ,MAAM,SAAS,SAAS;AAAA,IAChC,aAAa,MAAM,SAAS,SAAS;AAAA,IACrC,gBAAgB,MAAM;AAAA,IACtB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,EAClB;AACF;AAEA,SAAS,aAAa,OAA2B;AAC/C,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,YAAY,MAAM;AAAA,IAClB,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM,MAAM,SAAS;AAAA,IAC7B,aAAa,MAAM,MAAM,SAAS;AAAA,IAClC,gBAAgB,MAAM;AAAA,IACtB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,EAClB;AACF;AAEA,SAAS,iBAAiB,UAAgD;AACxE,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,gBAAgB,SAAS,KAAK;AAAA,EACtC;AACA,MAAI,CAAC,SAAS,UAAU,EAAE,cAAc,SAAS,SAAS;AACxD,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO,SAAS,OAAO;AACzB;AAEA,SAAS,qBAAqB,UAAmF;AAC/G,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,gBAAgB,SAAS,KAAK;AAAA,EACtC;AACA,MAAI,CAAC,SAAS,UAAU,EAAE,cAAc,SAAS,WAAW,EAAE,aAAa,SAAS,SAAS;AAC3F,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,oBAAoB,UAAgD;AAC3E,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,gBAAgB,SAAS,KAAK;AAAA,EACtC;AACA,MAAI,CAAC,SAAS,UAAU,EAAE,aAAa,SAAS,SAAS;AACvD,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO,SAAS,OAAO;AACzB;AAEA,SAAS,YAAY,QAAQ,KAAc;AACzC,SAAO,QAAQ,KAAK,KAAK;AAC3B;AAEA,SAAS,aAAa,QAAQ,KAAc;AAC1C,SAAO,MAAM,WAAW,GAAG;AAC7B;AAEA,SAAS,eAAe,QAAQ,KAAc;AAC5C,SAAO,MAAM,WAAW,GAAG;AAC7B;AAEA,IAAM,yBAAN,MAA6B;AAAA,EACV;AAAA,EACA;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EAEnB,YAAY,QAA4B,OAAgC;AACtE,SAAK,SAAS;AACd,SAAK,QAAQ;AAEb,QAAI,aAAa,MAAM,KAAK,GAAG;AAC7B,WAAK,WAAW,MAAM,QAAQ;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,aAAmB;AACzB,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,SAAe;AACrB,QAAI,CAAC,KAAK,OAAO;AACf;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,OAAO,YAAY;AAAA,MACvC,MAAM;AAAA,MACN,MAAM,KAAK,MAAM;AAAA,MACjB,SAAS,KAAK,MAAM;AAAA,MACpB,MAAM,KAAK,MAAM;AAAA,IACnB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,gBAAgB,SAAS,KAAK;AAAA,IACtC;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,SAAS,QAAgB,QAAgB,QAAgB,UAAiC;AACxF,SAAK,WAAW;AAChB,UAAM,WAAW,YAAY,KAAK;AAClC,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,SAAS,QAAQ;AAClE,UAAM,cAAc,KAAK,IAAI,QAAQ,SAAS;AAC9C,QAAI,gBAAgB,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,SAAK,MAAM,QAAQ,KAAK,QAAQ,QAAQ,UAAU,WAAW,WAAW;AACxE,QAAI,aAAa,QAAQ,aAAa,QAAW;AAC/C,WAAK,WAAW,WAAW;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,QAAgB,QAAgB,QAAgB,UAAiC;AACzF,SAAK,WAAW;AAChB,UAAM,YAAY,YAAY,KAAK;AACnC,UAAM,OAAO,OAAO,SAAS,QAAQ,SAAS,MAAM;AACpD,UAAM,iBAAiB,YAAY,KAAK;AAExC,QAAI,iBAAiB,KAAK,MAAM,QAAQ,QAAQ;AAC9C,YAAM,OAAOC,QAAO,MAAM,cAAc;AACxC,WAAK,MAAM,QAAQ,KAAK,MAAM,GAAG,GAAG,KAAK,MAAM,QAAQ,MAAM;AAC7D,WAAK,MAAM,UAAU;AAAA,IACvB;AAEA,SAAK,KAAK,KAAK,MAAM,SAAS,SAAS;AACvC,SAAK,MAAM,WAAW;AAAA,MACpB,GAAG,KAAK,MAAM;AAAA,MACd,MAAM,KAAK,MAAM,QAAQ;AAAA,MACzB,SAAS,KAAK,IAAI;AAAA,MAClB,SAAS,KAAK,IAAI;AAAA,IACpB;AACA,SAAK,QAAQ;AAEb,QAAI,aAAa,QAAQ,aAAa,QAAW;AAC/C,WAAK,WAAW,YAAY,KAAK;AAAA,IACnC;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAa,SAAyF;AACpG,SAAK,WAAW;AAChB,UAAM,WAAW,OAAO,YAAY,WAAW,UAAU,SAAS;AAClE,QAAI,UAAU;AACZ,aAAO,KAAK,MAAM,QAAQ,SAAS,QAAQ;AAAA,IAC7C;AACA,WAAOA,QAAO,KAAK,KAAK,MAAM,OAAO;AAAA,EACvC;AAAA,EAEA,cAAc,MAAuB,SAA+E;AAClH,SAAK,WAAW;AAChB,UAAM,WAAW,OAAO,YAAY,WAAW,UAAU,SAAS;AAClE,UAAM,SAAS,OAAO,SAAS,WAAWA,QAAO,KAAK,MAAM,QAAQ,IAAIA,QAAO,KAAK,IAAI;AAExF,QAAI,aAAa,KAAK,MAAM,KAAK,GAAG;AAClC,WAAK,MAAM,UAAUA,QAAO,OAAO,CAAC,KAAK,MAAM,SAAS,MAAM,CAAC;AAAA,IACjE,OAAO;AACL,WAAK,MAAM,UAAUA,QAAO,KAAK,MAAM;AAAA,IACzC;AAEA,SAAK,MAAM,WAAW;AAAA,MACpB,GAAG,KAAK,MAAM;AAAA,MACd,MAAM,KAAK,MAAM,QAAQ;AAAA,MACzB,SAAS,KAAK,IAAI;AAAA,MAClB,SAAS,KAAK,IAAI;AAAA,MAClB,MAAM,cAAc,QAAQ,OAAO,YAAY,WAAW,SAAS,OAAO,KAAK,MAAM,IAAI;AAAA,IAC3F;AACA,SAAK,QAAQ;AACb,SAAK,WAAW,KAAK,MAAM,QAAQ;AAAA,EACrC;AAAA,EAEA,WAAW;AACT,SAAK,WAAW;AAChB,WAAO,YAAY;AAAA,MACjB,GAAG,KAAK,MAAM;AAAA,MACd,MAAM,KAAK,MAAM,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,YAAkB;AAChB,SAAK,WAAW;AAChB,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AACF;AAEO,IAAM,uBAAN,cAAmC,gBAAgB;AAAA,EACvC;AAAA,EACA;AAAA,EAEjB,YAAY,SAAsC;AAChD,UAAM;AACN,SAAK,gBAAgB,QAAQ,aAAa;AAC1C,SAAK,SAAS,IAAI,mBAAmB;AAAA,MACnC,QAAQ,QAAQ;AAAA,MAChB,aAAa,QAAQ,eAAe;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,WAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO,MAAM;AAAA,EACpB;AAAA,EAEQ,eAAe,MAAc,SAAuB;AAC1D,QAAI,KAAK,eAAe;AACtB,YAAM,YAAY,SAAS,IAAI;AAAA,IACjC;AAAA,EACF;AAAA,EAEQ,UAAU,MAAsB;AACtC,WAAO,iBAAiB,IAAI;AAAA,EAC9B;AAAA,EAEA,SAAS,MAAc,QAAQ,KAAK,MAAe;AACjD,UAAM,aAAa,KAAK,UAAU,IAAI;AACtC,UAAM,WAAW,YAAY,KAAK;AAElC,QAAI,UAAU;AACZ,WAAK,eAAe,YAAY,MAAM;AAAA,IACxC;AAEA,QAAI;AACJ,QAAI,UAAUA,QAAO,MAAM,CAAC;AAE5B,QAAI;AACF,YAAM,WAAW,qBAAqB,KAAK,OAAO,YAAY,EAAE,MAAM,YAAY,MAAM,WAAW,CAAC,CAAC;AACrG,iBAAW,SAAS;AACpB,gBAAUA,QAAO,KAAK,SAAS,OAAO;AACtC,UAAI,eAAe,KAAK,GAAG;AACzB,kBAAUA,QAAO,MAAM,CAAC;AACxB,mBAAW;AAAA,UACT,GAAG;AAAA,UACH,MAAM;AAAA,UACN,MAAM,cAAc,QAAQ,QAAQ,SAAS,IAAI;AAAA,QACnD;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,QAAQ;AACd,UAAI,MAAM,SAAS,YAAY,CAAC,UAAU;AACxC,cAAM;AAAA,MACR;AAEA,iBAAW;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM,cAAc,QAAQ,IAAI;AAAA,QAChC,SAAS,KAAK,IAAI;AAAA,QAClB,SAAS,KAAK,IAAI;AAAA,QAClB,aAAa,KAAK,IAAI;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,QAAQ;AAC5B,YAAM,aAAa,QAAQ,UAAU;AAAA,IACvC;AAEA,WAAO,IAAI,uBAAuB,KAAK,QAAQ;AAAA,MAC7C,MAAM;AAAA,MACN;AAAA,MACA,MAAM,cAAc,QAAQ,QAAQ,SAAS,IAAI;AAAA,MACjD;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,MAAc,QAAQ,KAAK,MAAe;AACnD,WAAO,KAAK,SAAS,MAAM,OAAO,IAAI;AAAA,EACxC;AAAA,EAEA,SAAS,MAAc;AACrB,UAAM,aAAa,KAAK,UAAU,IAAI;AACtC,WAAO,YAAY,iBAAiB,KAAK,OAAO,YAAY,EAAE,MAAM,QAAQ,MAAM,WAAW,CAAC,CAAC,CAAC;AAAA,EAClG;AAAA,EAEA,MAAM,KAAK,MAAc;AACvB,WAAO,KAAK,SAAS,IAAI;AAAA,EAC3B;AAAA,EAEA,UAAU,MAAc;AACtB,WAAO,KAAK,SAAS,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,MAAM,MAAc;AACxB,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;AAAA,EAEA,YAAY,MAAc,SAAuC;AAC/D,UAAM,aAAa,KAAK,UAAU,IAAI;AACtC,UAAM,UAAU,oBAAoB,KAAK,OAAO,YAAY,EAAE,MAAM,WAAW,MAAM,WAAW,CAAC,CAAC;AAElG,QAAI,SAAS,eAAe;AAC1B,aAAO,QAAQ,IAAI,YAAY;AAAA,IACjC;AAEA,WAAO,QAAQ,IAAI,CAAC,UAA8B,MAAM,IAAI;AAAA,EAC9D;AAAA,EAEA,MAAM,QAAQ,MAAc,SAAuC;AACjE,WAAO,KAAK,YAAY,MAAM,OAAO;AAAA,EACvC;AAAA,EAEA,UAAU,MAAc,SAAkD;AACxE,UAAM,aAAa,KAAK,UAAU,IAAI;AACtC,SAAK,eAAe,YAAY,OAAO;AACvC,UAAM,WAAW,KAAK,OAAO,YAAY;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW,SAAS,cAAc;AAAA,MAClC,MAAM,SAAS;AAAA,IACjB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,gBAAgB,SAAS,KAAK;AAAA,IACtC;AACA,WAAO,SAAS,YAAY,aAAa;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAM,MAAc,SAAkD;AAC1E,WAAO,KAAK,UAAU,MAAM,OAAO;AAAA,EACrC;AAAA,EAEA,UAAU,MAAc;AACtB,UAAM,aAAa,KAAK,UAAU,IAAI;AACtC,SAAK,eAAe,YAAY,OAAO;AACvC,UAAM,WAAW,KAAK,OAAO,YAAY,EAAE,MAAM,SAAS,MAAM,WAAW,CAAC;AAC5E,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,gBAAgB,SAAS,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAc;AACxB,SAAK,UAAU,IAAI;AAAA,EACrB;AAAA,EAEA,WAAW,MAAc;AACvB,UAAM,aAAa,KAAK,UAAU,IAAI;AACtC,SAAK,eAAe,YAAY,QAAQ;AACxC,UAAM,WAAW,KAAK,OAAO,YAAY,EAAE,MAAM,UAAU,MAAM,WAAW,CAAC;AAC7E,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,gBAAgB,SAAS,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAc;AACzB,SAAK,WAAW,IAAI;AAAA,EACtB;AAAA,EAEA,WAAW,SAAiB,SAAiB;AAC3C,UAAM,gBAAgB,KAAK,UAAU,OAAO;AAC5C,UAAM,gBAAgB,KAAK,UAAU,OAAO;AAC5C,SAAK,eAAe,eAAe,QAAQ;AAC3C,UAAM,WAAW,KAAK,OAAO,YAAY;AAAA,MACvC,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,gBAAgB,SAAS,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAiB,SAAiB;AAC7C,SAAK,WAAW,SAAS,OAAO;AAAA,EAClC;AACF;AAEA,SAAS,gBAAgB,MAAyB,MAAmC;AACnF,MAAI,CAAC,KAAK,SAAS;AACjB,UAAM,IAAI,MAAM,+EAA+E;AAAA,EACjG;AAEA,QAAM,eAAe,QAAQ,KAAK,QAAQ,QAAQ;AAElD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,KAAK;AAAA,EAChB;AACF;AAEO,SAAS,mBAAmB,SAAwH;AACzJ,QAAM,WAAW,IAAI,qBAAqB,OAAO;AACjD,QAAM,MAAM,0BAA0B,OAAO,UAAU;AAAA,IACrD,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,EACtB,CAAC,CAAC;AAEF,MAAI,QAAQ,YAAY;AACtB,QAAI,MAAM,QAAQ,UAAU;AAAA,EAC9B;AAEA,SAAO,EAAE,UAAU,IAAI;AACzB;AAEO,SAAS,2BAA2B,MAAyB,UAAyC,CAAC,GAAG;AAC/G,SAAO,mBAAmB;AAAA,IACxB,GAAG;AAAA,IACH,QAAQ,gBAAgB,MAAM,QAAQ,IAAI;AAAA,EAC5C,CAAC;AACH;AAEA,eAAsB,4BAA4B,SAA6C;AAC7F,MAAI,CAAC,QAAQ,KAAK,SAAS;AACzB,UAAM,IAAI,MAAM,+EAA+E;AAAA,EACjG;AACA,MAAI,OAAO,QAAQ,KAAK,kBAAkB,YAAY;AACpD,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,QAAM,SAAS,MAAM,QAAQ,KAAK,cAAc,QAAQ,UAAU;AAClE,MAAI,CAAC,QAAQ,SAAS;AACpB,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AAEA,SAAO,mBAAmB;AAAA,IACxB,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,MAAM,QAAQ,QAAQ,QAAQ,WAAW,QAAQ;AAAA,MACjD,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO,IAAI,QAAQ,UAAU;AAAA,IACzC;AAAA,EACF,CAAC;AACH;","names":["Buffer","Buffer","Buffer","Buffer"]}
1
+ {"version":3,"sources":["../src/TinyCloudVfsProvider.ts","../src/bridge.ts","../src/errors.ts","../src/fsPatch.ts","../src/pathing.ts","../src/metadata.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { VirtualProvider, create } from \"@platformatic/vfs\";\nimport type { VirtualFileSystem } from \"@platformatic/vfs\";\nimport { TinyCloudVfsBridge } from \"./bridge\";\nimport {\n createEISDIR,\n createEROFS,\n fromWorkerError,\n} from \"./errors\";\nimport { wrapVfsWithFsWritePatches } from \"./fsPatch\";\nimport { normalizeMode } from \"./metadata\";\nimport { normalizeVfsPath } from \"./pathing\";\nimport type {\n CreateTinyCloudDelegatedVfsOptions,\n CreateTinyCloudNodeVfsOptions,\n TinyCloudVfsDirent,\n TinyCloudVfsMetadata,\n TinyCloudVfsOptions,\n TinyCloudVfsProviderOptions,\n TinyCloudVfsSource,\n TinyCloudVfsHandleState,\n TinyCloudNodeLike,\n WorkerResponse,\n} from \"./types\";\n\nconst S_IFREG = 0o100000;\nconst S_IFDIR = 0o040000;\nconst DEFAULT_BLOCK_SIZE = 4096;\n\nfunction createStats(metadata: TinyCloudVfsMetadata) {\n const mode = metadata.kind === \"directory\"\n ? (metadata.mode | S_IFDIR)\n : (metadata.mode | S_IFREG);\n\n return {\n dev: 0,\n mode,\n nlink: 1,\n uid: process.getuid?.() ?? 0,\n gid: process.getgid?.() ?? 0,\n rdev: 0,\n blksize: DEFAULT_BLOCK_SIZE,\n ino: 0,\n size: metadata.kind === \"directory\" ? DEFAULT_BLOCK_SIZE : metadata.size,\n blocks: metadata.kind === \"directory\" ? 8 : Math.ceil(metadata.size / 512),\n atimeMs: metadata.mtimeMs,\n mtimeMs: metadata.mtimeMs,\n ctimeMs: metadata.ctimeMs,\n birthtimeMs: metadata.birthtimeMs,\n atime: new Date(metadata.mtimeMs),\n mtime: new Date(metadata.mtimeMs),\n ctime: new Date(metadata.ctimeMs),\n birthtime: new Date(metadata.birthtimeMs),\n isFile: () => metadata.kind === \"file\",\n isDirectory: () => metadata.kind === \"directory\",\n isSymbolicLink: () => false,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction createDirent(entry: TinyCloudVfsDirent) {\n return {\n name: entry.name,\n parentPath: entry.parentPath,\n path: entry.parentPath,\n isFile: () => entry.kind === \"file\",\n isDirectory: () => entry.kind === \"directory\",\n isSymbolicLink: () => false,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isFIFO: () => false,\n isSocket: () => false,\n };\n}\n\nfunction expectStatResult(response: WorkerResponse): TinyCloudVfsMetadata {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"metadata\" in response.result)) {\n throw new Error(\"worker returned an unexpected stat payload\");\n }\n return response.result.metadata;\n}\n\nfunction expectReadFileResult(response: WorkerResponse): { metadata: TinyCloudVfsMetadata; content: Uint8Array } {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"metadata\" in response.result) || !(\"content\" in response.result)) {\n throw new Error(\"worker returned an unexpected readFile payload\");\n }\n return response.result;\n}\n\nfunction expectReaddirResult(response: WorkerResponse): TinyCloudVfsDirent[] {\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n if (!response.result || !(\"entries\" in response.result)) {\n throw new Error(\"worker returned an unexpected readdir payload\");\n }\n return response.result.entries;\n}\n\nfunction isWriteFlag(flags = \"r\"): boolean {\n return /[wa+]/.test(flags);\n}\n\nfunction isAppendFlag(flags = \"r\"): boolean {\n return flags.startsWith(\"a\");\n}\n\nfunction isTruncateFlag(flags = \"r\"): boolean {\n return flags.startsWith(\"w\");\n}\n\nclass TinyCloudVfsFileHandle {\n private readonly bridge: TinyCloudVfsBridge;\n private readonly state: TinyCloudVfsHandleState;\n private closed = false;\n private dirty = false;\n private position = 0;\n\n constructor(bridge: TinyCloudVfsBridge, state: TinyCloudVfsHandleState) {\n this.bridge = bridge;\n this.state = state;\n\n if (isAppendFlag(state.flags)) {\n this.position = state.content.length;\n }\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new Error(\"file handle is closed\");\n }\n }\n\n private commit(): void {\n if (!this.dirty) {\n return;\n }\n\n const response = this.bridge.requestSync({\n type: \"writeFile\",\n path: this.state.path,\n content: this.state.content,\n mode: this.state.mode,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n this.dirty = false;\n }\n\n readSync(buffer: Buffer, offset: number, length: number, position: number | null): number {\n this.ensureOpen();\n const readFrom = position ?? this.position;\n const available = Math.max(0, this.state.content.length - readFrom);\n const bytesToRead = Math.min(length, available);\n if (bytesToRead === 0) {\n return 0;\n }\n\n this.state.content.copy(buffer, offset, readFrom, readFrom + bytesToRead);\n if (position === null || position === undefined) {\n this.position = readFrom + bytesToRead;\n }\n return bytesToRead;\n }\n\n writeSync(buffer: Buffer, offset: number, length: number, position: number | null): number {\n this.ensureOpen();\n const writeFrom = position ?? this.position;\n const data = buffer.subarray(offset, offset + length);\n const requiredLength = writeFrom + data.length;\n\n if (requiredLength > this.state.content.length) {\n const next = Buffer.alloc(requiredLength);\n this.state.content.copy(next, 0, 0, this.state.content.length);\n this.state.content = next;\n }\n\n data.copy(this.state.content, writeFrom);\n this.state.metadata = {\n ...this.state.metadata,\n size: this.state.content.length,\n mtimeMs: Date.now(),\n ctimeMs: Date.now(),\n };\n this.dirty = true;\n\n if (position === null || position === undefined) {\n this.position = writeFrom + data.length;\n }\n\n return data.length;\n }\n\n readFileSync(options?: BufferEncoding | { encoding?: BufferEncoding | null } | null): Buffer | string {\n this.ensureOpen();\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n if (encoding) {\n return this.state.content.toString(encoding);\n }\n return Buffer.from(this.state.content);\n }\n\n writeFileSync(data: string | Buffer, options?: BufferEncoding | { encoding?: BufferEncoding; mode?: number }): void {\n this.ensureOpen();\n const encoding = typeof options === \"string\" ? options : options?.encoding;\n const buffer = typeof data === \"string\" ? Buffer.from(data, encoding) : Buffer.from(data);\n\n if (isAppendFlag(this.state.flags)) {\n this.state.content = Buffer.concat([this.state.content, buffer]);\n } else {\n this.state.content = Buffer.from(buffer);\n }\n\n this.state.metadata = {\n ...this.state.metadata,\n size: this.state.content.length,\n mtimeMs: Date.now(),\n ctimeMs: Date.now(),\n mode: normalizeMode(\"file\", typeof options === \"object\" ? options?.mode : this.state.mode),\n };\n this.dirty = true;\n this.position = this.state.content.length;\n }\n\n statSync() {\n this.ensureOpen();\n return createStats({\n ...this.state.metadata,\n size: this.state.content.length,\n });\n }\n\n closeSync(): void {\n this.ensureOpen();\n this.commit();\n this.closed = true;\n }\n}\n\nexport class TinyCloudVfsProvider extends VirtualProvider {\n private readonly bridge: TinyCloudVfsBridge;\n private readonly forceReadOnly: boolean;\n\n constructor(options: TinyCloudVfsProviderOptions) {\n super();\n this.forceReadOnly = options.readOnly === true;\n this.bridge = new TinyCloudVfsBridge({\n source: options.source,\n mountPrefix: options.mountPrefix ?? \"\",\n });\n }\n\n get readonly(): boolean {\n return this.forceReadOnly;\n }\n\n close(): void {\n this.bridge.close();\n }\n\n private ensureWritable(path: string, syscall: string): void {\n if (this.forceReadOnly) {\n throw createEROFS(syscall, path);\n }\n }\n\n private normalize(path: string): string {\n return normalizeVfsPath(path);\n }\n\n openSync(path: string, flags = \"r\", mode?: number) {\n const normalized = this.normalize(path);\n const writable = isWriteFlag(flags);\n\n if (writable) {\n this.ensureWritable(normalized, \"open\");\n }\n\n let metadata: TinyCloudVfsMetadata;\n let content = Buffer.alloc(0);\n\n try {\n const response = expectReadFileResult(this.bridge.requestSync({ type: \"readFile\", path: normalized }));\n metadata = response.metadata;\n content = Buffer.from(response.content);\n if (isTruncateFlag(flags)) {\n content = Buffer.alloc(0);\n metadata = {\n ...metadata,\n size: 0,\n mode: normalizeMode(\"file\", mode ?? metadata.mode),\n };\n }\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code !== \"ENOENT\" || !writable) {\n throw error;\n }\n\n metadata = {\n kind: \"file\",\n size: 0,\n mode: normalizeMode(\"file\", mode),\n ctimeMs: Date.now(),\n mtimeMs: Date.now(),\n birthtimeMs: Date.now(),\n };\n }\n\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"open\", normalized);\n }\n\n return new TinyCloudVfsFileHandle(this.bridge, {\n path: normalized,\n flags,\n mode: normalizeMode(\"file\", mode ?? metadata.mode),\n content,\n metadata,\n });\n }\n\n async open(path: string, flags = \"r\", mode?: number) {\n return this.openSync(path, flags, mode);\n }\n\n statSync(path: string) {\n const normalized = this.normalize(path);\n return createStats(expectStatResult(this.bridge.requestSync({ type: \"stat\", path: normalized })));\n }\n\n async stat(path: string) {\n return this.statSync(path);\n }\n\n lstatSync(path: string) {\n return this.statSync(path);\n }\n\n async lstat(path: string) {\n return this.lstatSync(path);\n }\n\n readdirSync(path: string, options?: { withFileTypes?: boolean }) {\n const normalized = this.normalize(path);\n const entries = expectReaddirResult(this.bridge.requestSync({ type: \"readdir\", path: normalized }));\n\n if (options?.withFileTypes) {\n return entries.map(createDirent);\n }\n\n return entries.map((entry: TinyCloudVfsDirent) => entry.name);\n }\n\n async readdir(path: string, options?: { withFileTypes?: boolean }) {\n return this.readdirSync(path, options);\n }\n\n mkdirSync(path: string, options?: { recursive?: boolean; mode?: number }) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"mkdir\");\n const response = this.bridge.requestSync({\n type: \"mkdir\",\n path: normalized,\n recursive: options?.recursive === true,\n mode: options?.mode,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n return options?.recursive ? normalized : undefined;\n }\n\n async mkdir(path: string, options?: { recursive?: boolean; mode?: number }) {\n return this.mkdirSync(path, options);\n }\n\n rmdirSync(path: string) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"rmdir\");\n const response = this.bridge.requestSync({ type: \"rmdir\", path: normalized });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async rmdir(path: string) {\n this.rmdirSync(path);\n }\n\n unlinkSync(path: string) {\n const normalized = this.normalize(path);\n this.ensureWritable(normalized, \"unlink\");\n const response = this.bridge.requestSync({ type: \"unlink\", path: normalized });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async unlink(path: string) {\n this.unlinkSync(path);\n }\n\n renameSync(oldPath: string, newPath: string) {\n const normalizedOld = this.normalize(oldPath);\n const normalizedNew = this.normalize(newPath);\n this.ensureWritable(normalizedOld, \"rename\");\n const response = this.bridge.requestSync({\n type: \"rename\",\n oldPath: normalizedOld,\n newPath: normalizedNew,\n });\n if (!response.ok) {\n throw fromWorkerError(response.error);\n }\n }\n\n async rename(oldPath: string, newPath: string) {\n this.renameSync(oldPath, newPath);\n }\n}\n\nfunction toSessionSource(node: TinyCloudNodeLike, host?: string): TinyCloudVfsSource {\n if (!node.session) {\n throw new Error(\"TinyCloudNode has no active session; call signIn() or restoreSession() first.\");\n }\n\n const resolvedHost = host ?? node.config?.host ?? \"https://node.tinycloud.xyz\";\n\n return {\n kind: \"session\",\n host: resolvedHost,\n session: node.session,\n };\n}\n\nexport function createTinyCloudVfs(options: TinyCloudVfsProviderOptions & TinyCloudVfsOptions): { provider: TinyCloudVfsProvider; vfs: VirtualFileSystem } {\n const provider = new TinyCloudVfsProvider(options);\n const vfs = wrapVfsWithFsWritePatches(create(provider, {\n moduleHooks: options.moduleHooks,\n overlay: options.overlay,\n virtualCwd: options.virtualCwd,\n }));\n\n if (options.mountPoint) {\n vfs.mount(options.mountPoint);\n }\n\n return { provider, vfs };\n}\n\nexport function createTinyCloudVfsFromNode(node: TinyCloudNodeLike, options: CreateTinyCloudNodeVfsOptions = {}) {\n return createTinyCloudVfs({\n ...options,\n source: toSessionSource(node, options.host),\n });\n}\n\nexport async function createTinyCloudDelegatedVfs(options: CreateTinyCloudDelegatedVfsOptions) {\n if (!options.node.session) {\n throw new Error(\"TinyCloudNode has no active session; call signIn() or restoreSession() first.\");\n }\n if (typeof options.node.useDelegation !== \"function\") {\n throw new Error(\"TinyCloudNode does not expose useDelegation().\");\n }\n\n const access = await options.node.useDelegation(options.delegation);\n if (!access?.session) {\n throw new Error(\"Delegated access does not expose a resolved session snapshot.\");\n }\n\n return createTinyCloudVfs({\n ...options,\n source: {\n kind: \"resolved-delegation\",\n host: options.host ?? options.delegation.host ?? \"https://node.tinycloud.xyz\",\n session: access.session,\n kvPrefix: access.kv?.config?.prefix ?? \"\",\n },\n });\n}\n","import { MessageChannel, Worker, receiveMessageOnPort } from \"node:worker_threads\";\nimport { join } from \"node:path\";\nimport type { TinyCloudVfsWorkerInit, WorkerRequest, WorkerResponse } from \"./types\";\nimport { createEIO } from \"./errors\";\n\nconst WAIT_SLICE_MS = 1_000;\n\nfunction createWaitSignal(): { buffer: SharedArrayBuffer; view: Int32Array } {\n const buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);\n return {\n buffer,\n view: new Int32Array(buffer),\n };\n}\n\nfunction resolveWorkerSpecifier(): string | URL {\n if (typeof __dirname !== \"undefined\") {\n return join(__dirname, \"worker.cjs\");\n }\n\n return new URL(\"./worker.js\", import.meta.url);\n}\n\nexport class TinyCloudVfsBridge {\n private readonly worker: Worker;\n\n constructor(init: TinyCloudVfsWorkerInit) {\n const specifier = resolveWorkerSpecifier();\n this.worker = typeof specifier === \"string\"\n ? new Worker(specifier)\n : new Worker(specifier);\n\n const response = this.requestSync({ type: \"init\", init });\n if (!response.ok) {\n this.worker.terminate();\n throw createEIO(\"init\", \"/\", response.error.message);\n }\n }\n\n close(): void {\n void this.worker.terminate();\n }\n\n requestSync(request: WorkerRequest): WorkerResponse {\n const { port1, port2 } = new MessageChannel();\n const { buffer, view } = createWaitSignal();\n\n this.worker.postMessage(\n {\n request,\n replyPort: port1,\n waitBuffer: buffer,\n },\n [port1],\n );\n\n while (Atomics.load(view, 0) === 0) {\n Atomics.wait(view, 0, 0, WAIT_SLICE_MS);\n }\n\n const response = receiveMessageOnPort(port2)?.message as WorkerResponse | undefined;\n port2.close();\n if (!response) {\n throw createEIO(\"bridge\", \"/\", \"worker did not return a response\");\n }\n\n return response;\n }\n\n async requestAsync(request: WorkerRequest): Promise<WorkerResponse> {\n return this.requestSync(request);\n }\n}\n","const ERRNO: Record<string, number> = {\n EPERM: -1,\n ENOENT: -2,\n EIO: -5,\n EBADF: -9,\n EACCES: -13,\n EBUSY: -16,\n EEXIST: -17,\n ENOTDIR: -20,\n EISDIR: -21,\n EINVAL: -22,\n ENOTEMPTY: -39,\n ENOSPC: -28,\n EROFS: -30,\n};\n\nexport function createNodeError(\n code: string,\n message: string,\n syscall: string,\n path?: string,\n): NodeJS.ErrnoException {\n const error = new Error(message) as NodeJS.ErrnoException;\n error.code = code;\n error.errno = ERRNO[code] ?? -1;\n error.syscall = syscall;\n if (path) {\n error.path = path;\n }\n return error;\n}\n\nexport function createENOENT(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOENT\", `no such file or directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEISDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EISDIR\", `illegal operation on a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTDIR\", `not a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTEMPTY\", `directory not empty, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEEXIST(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EEXIST\", `file already exists, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEACCES(syscall: string, path: string, message = \"permission denied\"): NodeJS.ErrnoException {\n return createNodeError(\"EACCES\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEROFS(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EROFS\", `read-only file system, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEIO(syscall: string, path: string, message: string): NodeJS.ErrnoException {\n return createNodeError(\"EIO\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\n/** The owner's TinyCloud storage is full (or too small for this write); nothing was written. */\nexport function createENOSPC(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOSPC\", `TinyCloud storage is full; nothing was written, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEBUSY(syscall: string, path: string, message = \"resource busy or locked\"): NodeJS.ErrnoException {\n return createNodeError(\"EBUSY\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEINVAL(syscall: string, path: string, message = \"invalid argument\"): NodeJS.ErrnoException {\n return createNodeError(\"EINVAL\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function fromWorkerError(error: { code: string; message: string; syscall?: string; path?: string }): NodeJS.ErrnoException {\n return createNodeError(\n error.code,\n error.message,\n error.syscall ?? \"vfs\",\n error.path,\n );\n}\n","import { Buffer } from \"node:buffer\";\nimport fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport type * as NodeFs from \"node:fs\";\nimport type * as NodeFsPromises from \"node:fs/promises\";\nimport { syncBuiltinESMExports } from \"node:module\";\nimport type { VirtualFileSystem } from \"@platformatic/vfs\";\nimport { fileURLToPath } from \"node:url\";\nimport { createNodeError } from \"./errors\";\n\ntype PathArg = string | Buffer | URL;\ntype WriteCallback = (error: NodeJS.ErrnoException | null) => void;\ntype MkdirCallback = (error: NodeJS.ErrnoException | null, path?: string) => void;\n\ninterface PatchableVirtualFileSystem extends VirtualFileSystem {\n mountPoint: string | null;\n mounted: boolean;\n shouldHandle(path: string): boolean;\n writeFileSync(path: string, data: unknown, options?: unknown): void;\n appendFileSync(path: string, data: unknown, options?: unknown): void;\n mkdirSync(path: string, options?: unknown): string | undefined;\n renameSync(oldPath: string, newPath: string): void;\n unlinkSync(path: string): void;\n rmdirSync(path: string, options?: unknown): void;\n promises: {\n writeFile(path: string, data: unknown, options?: unknown): Promise<void>;\n appendFile(path: string, data: unknown, options?: unknown): Promise<void>;\n mkdir(path: string, options?: unknown): Promise<string | undefined>;\n rename(oldPath: string, newPath: string): Promise<void>;\n unlink(path: string): Promise<void>;\n rmdir(path: string, options?: unknown): Promise<void>;\n };\n [Symbol.dispose]?: () => void;\n}\n\ninterface OriginalFsMethods {\n writeFileSync: typeof NodeFs.writeFileSync;\n appendFileSync: typeof NodeFs.appendFileSync;\n mkdirSync: typeof NodeFs.mkdirSync;\n renameSync: typeof NodeFs.renameSync;\n unlinkSync: typeof NodeFs.unlinkSync;\n rmdirSync: typeof NodeFs.rmdirSync;\n writeFile: typeof NodeFs.writeFile;\n appendFile: typeof NodeFs.appendFile;\n mkdir: typeof NodeFs.mkdir;\n rename: typeof NodeFs.rename;\n unlink: typeof NodeFs.unlink;\n rmdir: typeof NodeFs.rmdir;\n}\n\ninterface OriginalPromiseMethods {\n writeFile: typeof NodeFsPromises.writeFile;\n appendFile: typeof NodeFsPromises.appendFile;\n mkdir: typeof NodeFsPromises.mkdir;\n rename: typeof NodeFsPromises.rename;\n unlink: typeof NodeFsPromises.unlink;\n rmdir: typeof NodeFsPromises.rmdir;\n}\n\nconst activeVfs = new Set<PatchableVirtualFileSystem>();\nconst mutableFs = fs as typeof NodeFs & { promises: typeof NodeFsPromises };\nconst mutableFsPromises = fsPromises as typeof NodeFsPromises;\n\nconst originalFsMethods: OriginalFsMethods = {\n writeFileSync: mutableFs.writeFileSync.bind(mutableFs),\n appendFileSync: mutableFs.appendFileSync.bind(mutableFs),\n mkdirSync: mutableFs.mkdirSync.bind(mutableFs),\n renameSync: mutableFs.renameSync.bind(mutableFs),\n unlinkSync: mutableFs.unlinkSync.bind(mutableFs),\n rmdirSync: mutableFs.rmdirSync.bind(mutableFs),\n writeFile: mutableFs.writeFile.bind(mutableFs),\n appendFile: mutableFs.appendFile.bind(mutableFs),\n mkdir: mutableFs.mkdir.bind(mutableFs),\n rename: mutableFs.rename.bind(mutableFs),\n unlink: mutableFs.unlink.bind(mutableFs),\n rmdir: mutableFs.rmdir.bind(mutableFs),\n};\n\nconst originalPromiseMethods: OriginalPromiseMethods = {\n writeFile: mutableFsPromises.writeFile.bind(mutableFsPromises),\n appendFile: mutableFsPromises.appendFile.bind(mutableFsPromises),\n mkdir: mutableFsPromises.mkdir.bind(mutableFsPromises),\n rename: mutableFsPromises.rename.bind(mutableFsPromises),\n unlink: mutableFsPromises.unlink.bind(mutableFsPromises),\n rmdir: mutableFsPromises.rmdir.bind(mutableFsPromises),\n};\n\nlet installed = false;\n\nfunction toPathString(path: unknown): string | null {\n if (typeof path === \"string\") {\n return path;\n }\n if (Buffer.isBuffer(path)) {\n return path.toString();\n }\n if (path instanceof URL) {\n return fileURLToPath(path);\n }\n return null;\n}\n\nfunction activeVfsBySpecificity(): PatchableVirtualFileSystem[] {\n return [...activeVfs].sort((left, right) => {\n return (right.mountPoint?.length ?? 0) - (left.mountPoint?.length ?? 0);\n });\n}\n\nfunction findMountedVfs(path: unknown): { vfs: PatchableVirtualFileSystem; path: string } | null {\n const normalizedPath = toPathString(path);\n if (!normalizedPath) {\n return null;\n }\n\n for (const vfs of activeVfsBySpecificity()) {\n if (vfs.mounted && vfs.shouldHandle(normalizedPath)) {\n return { vfs, path: normalizedPath };\n }\n }\n\n return null;\n}\n\nfunction findMountedVfsForPaths(paths: unknown[], syscall: string): { vfs: PatchableVirtualFileSystem; paths: string[] } | null {\n let selected: PatchableVirtualFileSystem | null = null;\n const normalizedPaths: string[] = [];\n\n for (const path of paths) {\n const normalizedPath = toPathString(path);\n if (!normalizedPath) {\n normalizedPaths.push(String(path));\n continue;\n }\n\n normalizedPaths.push(normalizedPath);\n const match = findMountedVfs(normalizedPath);\n if (!match) {\n continue;\n }\n\n if (selected && selected !== match.vfs) {\n throw createNodeError(\n \"EXDEV\",\n `cross-device link not permitted, ${syscall} '${normalizedPaths.join(\"' -> '\")}'`,\n syscall,\n normalizedPath,\n );\n }\n\n selected = match.vfs;\n }\n\n if (!selected) {\n return null;\n }\n\n return { vfs: selected, paths: normalizedPaths };\n}\n\nfunction withCallback<T>(promise: Promise<T>, callback: (error: NodeJS.ErrnoException | null, result?: T) => void): void {\n promise.then(\n (result) => process.nextTick(callback, null, result),\n (error) => process.nextTick(callback, error as NodeJS.ErrnoException),\n );\n}\n\nfunction installFsWritePatches(): void {\n if (installed) {\n return;\n }\n\n mutableFs.writeFileSync = ((file: PathArg, data: unknown, options?: unknown) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.writeFileSync(file, data as never, options as never);\n }\n return match.vfs.writeFileSync(match.path, data, options);\n }) as typeof NodeFs.writeFileSync;\n\n mutableFs.appendFileSync = ((file: PathArg, data: unknown, options?: unknown) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.appendFileSync(file, data as never, options as never);\n }\n return match.vfs.appendFileSync(match.path, data, options);\n }) as typeof NodeFs.appendFileSync;\n\n mutableFs.mkdirSync = ((path: PathArg, options?: unknown) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.mkdirSync(path, options as never);\n }\n return match.vfs.mkdirSync(match.path, options);\n }) as typeof NodeFs.mkdirSync;\n\n mutableFs.renameSync = ((oldPath: PathArg, newPath: PathArg) => {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalFsMethods.renameSync(oldPath, newPath);\n }\n const [normalizedOld, normalizedNew] = match.paths;\n return match.vfs.renameSync(normalizedOld, normalizedNew);\n }) as typeof NodeFs.renameSync;\n\n mutableFs.unlinkSync = ((path: PathArg) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.unlinkSync(path);\n }\n return match.vfs.unlinkSync(match.path);\n }) as typeof NodeFs.unlinkSync;\n\n mutableFs.rmdirSync = ((path: PathArg, options?: unknown) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.rmdirSync(path, options as never);\n }\n return match.vfs.rmdirSync(match.path, options);\n }) as typeof NodeFs.rmdirSync;\n\n mutableFs.writeFile = ((file: PathArg, data: unknown, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.writeFile(file, data as never, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.writeFile(file, data as never, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.writeFile(match.path, data, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.writeFile;\n\n mutableFs.appendFile = ((file: PathArg, data: unknown, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(file);\n if (!match) {\n return originalFsMethods.appendFile(file, data as never, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.appendFile(file, data as never, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.appendFile(match.path, data, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.appendFile;\n\n mutableFs.mkdir = ((path: PathArg, options?: unknown, callback?: MkdirCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.mkdir(path, options as never, callback as never);\n }\n\n const resolvedOptions = typeof options === \"function\" ? undefined : options;\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.mkdir(path, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.mkdir(match.path, resolvedOptions), resolvedCallback);\n }) as typeof NodeFs.mkdir;\n\n mutableFs.rename = ((oldPath: PathArg, newPath: PathArg, callback?: WriteCallback) => {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalFsMethods.rename(oldPath, newPath, callback as never);\n }\n if (typeof callback !== \"function\") {\n return originalFsMethods.rename(oldPath, newPath, callback as never);\n }\n\n const [normalizedOld, normalizedNew] = match.paths;\n withCallback(match.vfs.promises.rename(normalizedOld, normalizedNew), callback);\n }) as typeof NodeFs.rename;\n\n mutableFs.unlink = ((path: PathArg, callback?: WriteCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.unlink(path, callback as never);\n }\n if (typeof callback !== \"function\") {\n return originalFsMethods.unlink(path, callback as never);\n }\n\n withCallback(match.vfs.promises.unlink(match.path), callback);\n }) as typeof NodeFs.unlink;\n\n mutableFs.rmdir = ((path: PathArg, options?: unknown, callback?: WriteCallback) => {\n const match = findMountedVfs(path);\n if (!match) {\n return originalFsMethods.rmdir(path, options as never, callback as never);\n }\n\n const resolvedCallback = typeof options === \"function\" ? options : callback;\n if (typeof resolvedCallback !== \"function\") {\n return originalFsMethods.rmdir(path, options as never, callback as never);\n }\n\n withCallback(match.vfs.promises.rmdir(match.path, typeof options === \"function\" ? undefined : options), resolvedCallback);\n }) as typeof NodeFs.rmdir;\n\n const promisePatches: OriginalPromiseMethods = {\n async writeFile(file: PathArg, data: unknown, options?: unknown) {\n const match = findMountedVfs(file);\n if (!match) {\n return originalPromiseMethods.writeFile(file, data as never, options as never);\n }\n return match.vfs.promises.writeFile(match.path, data, options);\n },\n\n async appendFile(file: PathArg, data: unknown, options?: unknown) {\n const match = findMountedVfs(file);\n if (!match) {\n return originalPromiseMethods.appendFile(file, data as never, options as never);\n }\n return match.vfs.promises.appendFile(match.path, data, options);\n },\n\n async mkdir(path: PathArg, options?: unknown) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.mkdir(path, options as never);\n }\n return match.vfs.promises.mkdir(match.path, options);\n },\n\n async rename(oldPath: PathArg, newPath: PathArg) {\n const match = findMountedVfsForPaths([oldPath, newPath], \"rename\");\n if (!match) {\n return originalPromiseMethods.rename(oldPath, newPath);\n }\n const [normalizedOld, normalizedNew] = match.paths;\n return match.vfs.promises.rename(normalizedOld, normalizedNew);\n },\n\n async unlink(path: PathArg) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.unlink(path);\n }\n return match.vfs.promises.unlink(match.path);\n },\n\n async rmdir(path: PathArg, options?: unknown) {\n const match = findMountedVfs(path);\n if (!match) {\n return originalPromiseMethods.rmdir(path, options as never);\n }\n return match.vfs.promises.rmdir(match.path, options);\n },\n };\n\n mutableFs.promises.writeFile = promisePatches.writeFile;\n mutableFs.promises.appendFile = promisePatches.appendFile;\n mutableFs.promises.mkdir = promisePatches.mkdir;\n mutableFs.promises.rename = promisePatches.rename;\n mutableFs.promises.unlink = promisePatches.unlink;\n mutableFs.promises.rmdir = promisePatches.rmdir;\n\n mutableFsPromises.writeFile = promisePatches.writeFile;\n mutableFsPromises.appendFile = promisePatches.appendFile;\n mutableFsPromises.mkdir = promisePatches.mkdir;\n mutableFsPromises.rename = promisePatches.rename;\n mutableFsPromises.unlink = promisePatches.unlink;\n mutableFsPromises.rmdir = promisePatches.rmdir;\n\n syncBuiltinESMExports();\n installed = true;\n}\n\nfunction uninstallFsWritePatches(): void {\n if (!installed || activeVfs.size > 0) {\n return;\n }\n\n mutableFs.writeFileSync = originalFsMethods.writeFileSync;\n mutableFs.appendFileSync = originalFsMethods.appendFileSync;\n mutableFs.mkdirSync = originalFsMethods.mkdirSync;\n mutableFs.renameSync = originalFsMethods.renameSync;\n mutableFs.unlinkSync = originalFsMethods.unlinkSync;\n mutableFs.rmdirSync = originalFsMethods.rmdirSync;\n mutableFs.writeFile = originalFsMethods.writeFile;\n mutableFs.appendFile = originalFsMethods.appendFile;\n mutableFs.mkdir = originalFsMethods.mkdir;\n mutableFs.rename = originalFsMethods.rename;\n mutableFs.unlink = originalFsMethods.unlink;\n mutableFs.rmdir = originalFsMethods.rmdir;\n\n mutableFs.promises.writeFile = originalPromiseMethods.writeFile;\n mutableFs.promises.appendFile = originalPromiseMethods.appendFile;\n mutableFs.promises.mkdir = originalPromiseMethods.mkdir;\n mutableFs.promises.rename = originalPromiseMethods.rename;\n mutableFs.promises.unlink = originalPromiseMethods.unlink;\n mutableFs.promises.rmdir = originalPromiseMethods.rmdir;\n\n mutableFsPromises.writeFile = originalPromiseMethods.writeFile;\n mutableFsPromises.appendFile = originalPromiseMethods.appendFile;\n mutableFsPromises.mkdir = originalPromiseMethods.mkdir;\n mutableFsPromises.rename = originalPromiseMethods.rename;\n mutableFsPromises.unlink = originalPromiseMethods.unlink;\n mutableFsPromises.rmdir = originalPromiseMethods.rmdir;\n\n syncBuiltinESMExports();\n installed = false;\n}\n\nfunction registerMountedVfs(vfs: PatchableVirtualFileSystem): void {\n activeVfs.add(vfs);\n installFsWritePatches();\n}\n\nfunction deregisterMountedVfs(vfs: PatchableVirtualFileSystem): void {\n activeVfs.delete(vfs);\n uninstallFsWritePatches();\n}\n\nexport function wrapVfsWithFsWritePatches(vfs: VirtualFileSystem): VirtualFileSystem {\n const patchableVfs = vfs as PatchableVirtualFileSystem;\n const originalMount = vfs.mount.bind(vfs);\n const originalUnmount = vfs.unmount.bind(vfs);\n const originalDispose = patchableVfs[Symbol.dispose]?.bind(vfs);\n let registered = false;\n\n patchableVfs.mount = ((prefix: string) => {\n const mounted = originalMount(prefix);\n if (!registered) {\n registerMountedVfs(patchableVfs);\n registered = true;\n }\n return mounted;\n }) as typeof vfs.mount;\n\n patchableVfs.unmount = (() => {\n if (registered) {\n deregisterMountedVfs(patchableVfs);\n registered = false;\n }\n return originalUnmount();\n }) as typeof vfs.unmount;\n\n if (originalDispose) {\n patchableVfs[Symbol.dispose] = (() => {\n if (registered) {\n deregisterMountedVfs(patchableVfs);\n registered = false;\n }\n return originalDispose();\n }) as typeof patchableVfs[typeof Symbol.dispose];\n }\n\n return patchableVfs;\n}\n","import { posix as pathPosix } from \"node:path\";\n\nexport const INTERNAL_META_PREFIX = \".tcvfs-meta\";\n\nexport function normalizeVfsPath(inputPath: string): string {\n const normalized = pathPosix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n const absolute = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n return absolute;\n}\n\nexport function toLogicalPath(inputPath: string): string {\n const normalized = normalizeVfsPath(inputPath);\n\n if (normalized.includes(\"\\0\")) {\n throw new Error(\"invalid path\");\n }\n\n if (normalized === \"/\") {\n return \"\";\n }\n\n const logical = normalized.slice(1);\n if (\n logical === INTERNAL_META_PREFIX ||\n logical.startsWith(`${INTERNAL_META_PREFIX}/`) ||\n logical.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\"path escapes virtual root\");\n }\n\n return logical;\n}\n\nexport function normalizeStoragePrefix(prefix?: string): string {\n if (!prefix) {\n return \"\";\n }\n\n return prefix\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nexport function joinStoragePath(...parts: Array<string | undefined>): string {\n const cleaned = parts\n .filter((part): part is string => Boolean(part))\n .map((part) => normalizeStoragePrefix(part));\n\n return cleaned.filter(Boolean).join(\"/\");\n}\n\nexport function dirnameOf(logicalPath: string): string {\n if (!logicalPath) {\n return \"\";\n }\n\n const dir = pathPosix.dirname(`/${logicalPath}`);\n return dir === \"/\" ? \"\" : dir.slice(1);\n}\n\nexport function basenameOf(logicalPath: string): string {\n return pathPosix.basename(logicalPath ? `/${logicalPath}` : \"/\");\n}\n","import { INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix } from \"./pathing\";\nimport type { TinyCloudVfsFileEnvelope, TinyCloudVfsMetadata } from \"./types\";\n\nexport function dataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, logicalPath);\n}\n\nexport function metadataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function metadataPrefix(storageRoot: string, logicalPath = \"\"): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function encodeEnvelope(content: Buffer): TinyCloudVfsFileEnvelope {\n return {\n version: 1,\n encoding: \"base64\",\n data: content.toString(\"base64\"),\n };\n}\n\nfunction isEnvelopeShape(value: unknown): value is TinyCloudVfsFileEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as TinyCloudVfsFileEnvelope).version === 1 &&\n (value as TinyCloudVfsFileEnvelope).encoding === \"base64\" &&\n typeof (value as TinyCloudVfsFileEnvelope).data === \"string\"\n );\n}\n\nexport function encodeFileValue(content: Buffer): string | TinyCloudVfsFileEnvelope {\n const utf8 = content.toString(\"utf8\");\n if (Buffer.from(utf8, \"utf8\").equals(content)) {\n return utf8;\n }\n\n return encodeEnvelope(content);\n}\n\nexport function decodeEnvelope(value: unknown): Buffer {\n if (isEnvelopeShape(value)) {\n return Buffer.from((value as TinyCloudVfsFileEnvelope).data, \"base64\");\n }\n\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isEnvelopeShape(parsed)) {\n return Buffer.from(parsed.data, \"base64\");\n }\n } catch {\n // Plain text payloads are expected and should fall through.\n }\n\n return Buffer.from(value, \"utf8\");\n }\n\n throw new Error(\"unsupported file payload\");\n}\n\nfunction isMetadataShape(value: unknown): value is TinyCloudVfsMetadata {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (((value as TinyCloudVfsMetadata).kind === \"file\") || ((value as TinyCloudVfsMetadata).kind === \"directory\")) &&\n typeof (value as TinyCloudVfsMetadata).size === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mode === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).ctimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mtimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).birthtimeMs === \"number\"\n );\n}\n\nexport function decodeMetadata(value: unknown): TinyCloudVfsMetadata {\n if (isMetadataShape(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown;\n if (isMetadataShape(parsed)) {\n return parsed;\n }\n }\n\n throw new Error(\"unsupported metadata payload\");\n}\n\nexport function nowMetadata(kind: \"file\" | \"directory\", size: number, mode: number, existing?: TinyCloudVfsMetadata): TinyCloudVfsMetadata {\n const now = Date.now();\n return {\n kind,\n size,\n mode,\n ctimeMs: now,\n mtimeMs: now,\n birthtimeMs: existing?.birthtimeMs ?? now,\n };\n}\n\nexport function normalizeMode(kind: \"file\" | \"directory\", mode?: number): number {\n if (typeof mode === \"number\" && Number.isFinite(mode)) {\n return mode;\n }\n\n return kind === \"directory\" ? 0o755 : 0o644;\n}\n\nexport function stripStoragePrefix(fullKey: string, prefix: string): string {\n const normalizedPrefix = normalizeStoragePrefix(prefix);\n if (!normalizedPrefix) {\n return fullKey.replace(/^\\/+/, \"\");\n }\n\n const withSlash = `${normalizedPrefix}/`;\n if (fullKey === normalizedPrefix) {\n return \"\";\n }\n\n if (fullKey.startsWith(withSlash)) {\n return fullKey.slice(withSlash.length);\n }\n\n return fullKey;\n}\n"],"mappings":"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","names":["Buffer","Buffer","Buffer","Buffer"]}
package/dist/worker.cjs CHANGED
@@ -17,6 +17,7 @@ var ERRNO = {
17
17
  EISDIR: -21,
18
18
  EINVAL: -22,
19
19
  ENOTEMPTY: -39,
20
+ ENOSPC: -28,
20
21
  EROFS: -30
21
22
  };
22
23
  function createNodeError(code, message, syscall, path) {
@@ -50,6 +51,9 @@ function createEACCES(syscall, path, message = "permission denied") {
50
51
  function createEIO(syscall, path, message) {
51
52
  return createNodeError("EIO", `${message}, ${syscall} '${path}'`, syscall, path);
52
53
  }
54
+ function createENOSPC(syscall, path) {
55
+ return createNodeError("ENOSPC", `TinyCloud storage is full; nothing was written, ${syscall} '${path}'`, syscall, path);
56
+ }
53
57
  function createEBUSY(syscall, path, message = "resource busy or locked") {
54
58
  return createNodeError("EBUSY", `${message}, ${syscall} '${path}'`, syscall, path);
55
59
  }
@@ -275,6 +279,9 @@ async function kvPut(key, value) {
275
279
  if (result.error?.code === "AUTH_UNAUTHORIZED") {
276
280
  throw createEACCES("put", key, result.error.message);
277
281
  }
282
+ if (result.error?.code === "STORAGE_QUOTA_EXCEEDED" || result.error?.code === "STORAGE_LIMIT_REACHED") {
283
+ throw createENOSPC("put", key);
284
+ }
278
285
  throw createEIO("put", key, result.error?.message ?? "kv put failed");
279
286
  }
280
287
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/worker.ts","../src/errors.ts","../src/pathing.ts","../src/metadata.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport type { MessagePort } from \"node:worker_threads\";\nimport { TinyCloudNode } from \"@tinycloud/node-sdk\";\nimport { createEACCES, createEEXIST, createEIO, createEISDIR, createENOTDIR, createENOTEMPTY, createENOENT, createEINVAL, createEBUSY } from \"./errors\";\nimport { dirnameOf, INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix, toLogicalPath } from \"./pathing\";\nimport { dataKey, decodeEnvelope, decodeMetadata, encodeFileValue, metadataKey, metadataPrefix, normalizeMode, nowMetadata, stripStoragePrefix } from \"./metadata\";\nimport type {\n TinyCloudVfsDirent,\n TinyCloudVfsMetadata,\n TinyCloudVfsSource,\n TinyCloudVfsWorkerInit,\n WorkerRequest,\n WorkerResponse,\n} from \"./types\";\n\ntype KvLike = {\n config?: { prefix?: string };\n get: (key: string, options?: Record<string, unknown>) => Promise<any>;\n put: (key: string, value: unknown, options?: Record<string, unknown>) => Promise<any>;\n list: (options?: Record<string, unknown>) => Promise<any>;\n delete: (key: string, options?: Record<string, unknown>) => Promise<any>;\n};\n\ninterface WorkerState {\n kv: KvLike | null;\n kvPrefix: string;\n storageRoot: string;\n}\n\nconst state: WorkerState = {\n kv: null,\n kvPrefix: \"\",\n storageRoot: \"\",\n};\n\nfunction toWorkerError(error: unknown): WorkerResponse {\n if (error && typeof error === \"object\" && \"code\" in error && \"message\" in error) {\n const typed = error as NodeJS.ErrnoException;\n return {\n ok: false,\n error: {\n code: typed.code ?? \"EIO\",\n message: typed.message,\n syscall: typed.syscall,\n path: typed.path,\n },\n };\n }\n\n return {\n ok: false,\n error: {\n code: \"EIO\",\n message: error instanceof Error ? error.message : String(error),\n syscall: \"vfs\",\n },\n };\n}\n\nfunction ensureKv(): KvLike {\n if (!state.kv) {\n throw createEIO(\"init\", \"/\", \"worker is not initialized\");\n }\n return state.kv;\n}\n\nfunction ensureMountedLogicalPath(inputPath: string): string {\n try {\n return toLogicalPath(inputPath);\n } catch {\n throw createENOENT(\"resolve\", inputPath);\n }\n}\n\nfunction effectiveStorageRoot(): string {\n return joinStoragePath(state.kvPrefix, state.storageRoot);\n}\n\nfunction effectiveStoragePath(logicalPath = \"\"): string {\n return joinStoragePath(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedDataKey(logicalPath: string): string {\n return dataKey(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedMetaKey(logicalPath: string): string {\n return metadataKey(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedMetaPrefix(logicalPath = \"\"): string {\n return metadataPrefix(effectiveStorageRoot(), logicalPath);\n}\n\nfunction effectiveListPrefix(logicalPath = \"\", options?: { trailingSlash?: boolean }): string {\n const prefix = effectiveStoragePath(logicalPath);\n if (!options?.trailingSlash || !prefix) {\n return prefix;\n }\n return prefix.endsWith(\"/\") ? prefix : `${prefix}/`;\n}\n\nasync function kvGet(key: string): Promise<unknown> {\n const kv = ensureKv();\n const result = await kv.get(key);\n if (!result.ok) {\n if (result.error?.code === \"KV_NOT_FOUND\") {\n throw createENOENT(\"get\", key);\n }\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"get\", key, result.error.message);\n }\n throw createEIO(\"get\", key, result.error?.message ?? \"kv get failed\");\n }\n\n return result.data.data;\n}\n\nasync function kvPut(key: string, value: unknown): Promise<void> {\n const kv = ensureKv();\n const result = await kv.put(key, value);\n if (!result.ok) {\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"put\", key, result.error.message);\n }\n throw createEIO(\"put\", key, result.error?.message ?? \"kv put failed\");\n }\n}\n\nasync function kvDelete(key: string): Promise<void> {\n const kv = ensureKv();\n const result = await kv.delete(key);\n if (!result.ok) {\n if (result.error?.code === \"KV_NOT_FOUND\") {\n throw createENOENT(\"unlink\", key);\n }\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"unlink\", key, result.error.message);\n }\n throw createEIO(\"unlink\", key, result.error?.message ?? \"kv delete failed\");\n }\n}\n\nasync function kvList(prefix: string): Promise<string[]> {\n const kv = ensureKv();\n const listOptions = prefix\n ? { prefix, removePrefix: false }\n : { removePrefix: false };\n const result = await kv.list(listOptions);\n if (!result.ok) {\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"scandir\", prefix, result.error.message);\n }\n throw createEIO(\"scandir\", prefix, result.error?.message ?? \"kv list failed\");\n }\n return result.data.keys ?? [];\n}\n\nasync function tryMetadata(logicalPath: string): Promise<TinyCloudVfsMetadata | null> {\n try {\n return decodeMetadata(await kvGet(scopedMetaKey(logicalPath)));\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function tryRawFile(logicalPath: string): Promise<{ content: Buffer; metadata: TinyCloudVfsMetadata } | null> {\n try {\n const content = decodeEnvelope(await kvGet(scopedDataKey(logicalPath)));\n const metadata = nowMetadata(\n \"file\",\n content.length,\n normalizeMode(\"file\"),\n );\n return { content, metadata };\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function listDescendantKeys(logicalPath: string): Promise<{ dataKeys: string[]; metaKeys: string[] }> {\n const dataPrefixValue = effectiveListPrefix(logicalPath, { trailingSlash: true });\n const metaPrefixValue = effectiveListPrefix(\n joinStoragePath(\".tcvfs-meta\", logicalPath),\n { trailingSlash: true },\n );\n\n const [dataKeys, metaKeys] = await Promise.all([\n kvList(dataPrefixValue),\n kvList(metaPrefixValue),\n ]);\n\n return { dataKeys, metaKeys };\n}\n\nasync function tryInferredDirectory(logicalPath: string): Promise<TinyCloudVfsMetadata | null> {\n const { dataKeys, metaKeys } = await listDescendantKeys(logicalPath);\n if (dataKeys.length === 0 && metaKeys.length === 0) {\n return null;\n }\n\n return nowMetadata(\n \"directory\",\n 4096,\n normalizeMode(\"directory\"),\n );\n}\n\nasync function ensureDirectory(logicalPath: string): Promise<TinyCloudVfsMetadata> {\n if (!logicalPath) {\n return nowMetadata(\"directory\", 4096, normalizeMode(\"directory\"));\n }\n\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n if (metadata.kind !== \"directory\") {\n throw createENOTDIR(\"stat\", `/${logicalPath}`);\n }\n return metadata;\n }\n\n const inferred = await tryInferredDirectory(logicalPath);\n if (!inferred) {\n throw createENOENT(\"stat\", `/${logicalPath}`);\n }\n return inferred;\n}\n\nasync function readFileEntry(logicalPath: string): Promise<{ content: Buffer; metadata: TinyCloudVfsMetadata }> {\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"open\", `/${logicalPath}`);\n }\n\n const content = decodeEnvelope(await kvGet(scopedDataKey(logicalPath)));\n return { content, metadata };\n }\n\n const rawFile = await tryRawFile(logicalPath);\n if (rawFile) {\n return rawFile;\n }\n\n if (await tryInferredDirectory(logicalPath)) {\n throw createEISDIR(\"open\", `/${logicalPath}`);\n }\n\n throw createENOENT(\"open\", `/${logicalPath}`);\n}\n\nasync function statPath(logicalPath: string): Promise<TinyCloudVfsMetadata> {\n if (!logicalPath) {\n return nowMetadata(\"directory\", 4096, normalizeMode(\"directory\"));\n }\n\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n return metadata;\n }\n\n const rawFile = await tryRawFile(logicalPath);\n if (rawFile) {\n return rawFile.metadata;\n }\n\n const inferredDirectory = await tryInferredDirectory(logicalPath);\n if (inferredDirectory) {\n return inferredDirectory;\n }\n\n throw createENOENT(\"stat\", `/${logicalPath}`);\n}\n\nasync function ensureParentDirectory(logicalPath: string): Promise<void> {\n const parent = dirnameOf(logicalPath);\n if (!parent) {\n return;\n }\n await ensureDirectory(parent);\n}\n\nasync function collectDirChildren(logicalPath: string): Promise<TinyCloudVfsDirent[]> {\n await ensureDirectory(logicalPath);\n\n const { dataKeys, metaKeys } = await listDescendantKeys(logicalPath);\n\n const names = new Set<string>();\n const relativePrefix = effectiveStoragePath(logicalPath);\n const relativeMetaPrefix = scopedMetaPrefix(logicalPath);\n\n for (const fullKey of dataKeys) {\n const relative = stripStoragePrefix(fullKey, relativePrefix);\n const first = relative.split(\"/\").filter(Boolean)[0];\n if (first) {\n names.add(first);\n }\n }\n\n for (const fullKey of metaKeys) {\n const relative = stripStoragePrefix(fullKey, relativeMetaPrefix);\n const first = relative.split(\"/\").filter(Boolean)[0];\n if (first) {\n names.add(first);\n }\n }\n\n const entries = await Promise.all(\n [...names]\n .filter((name) => name !== INTERNAL_META_PREFIX)\n .sort()\n .map(async (name): Promise<TinyCloudVfsDirent> => {\n const childPath = joinStoragePath(logicalPath, name);\n const metadata = await statPath(childPath);\n return {\n name,\n kind: metadata.kind,\n parentPath: logicalPath ? `/${logicalPath}` : \"/\",\n };\n }),\n );\n\n return entries;\n}\n\nasync function writeFileEntry(logicalPath: string, content: Uint8Array, mode?: number): Promise<TinyCloudVfsMetadata> {\n await ensureParentDirectory(logicalPath);\n const existing = await tryMetadata(logicalPath);\n if (existing) {\n if (existing.kind !== \"file\") {\n throw createEISDIR(\"writeFile\", `/${logicalPath}`);\n }\n } else if (await tryInferredDirectory(logicalPath)) {\n throw createEISDIR(\"writeFile\", `/${logicalPath}`);\n }\n\n const buffer = Buffer.from(content);\n const metadata = nowMetadata(\n \"file\",\n buffer.length,\n normalizeMode(\"file\", mode ?? existing?.mode),\n existing ?? undefined,\n );\n\n await kvPut(scopedDataKey(logicalPath), encodeFileValue(buffer));\n await kvPut(scopedMetaKey(logicalPath), metadata);\n return metadata;\n}\n\nasync function mkdirEntry(logicalPath: string, recursive = false, mode?: number): Promise<void> {\n if (!logicalPath) {\n return;\n }\n\n const existing = await tryMetadata(logicalPath);\n if (existing) {\n if (existing.kind === \"directory\") {\n return;\n }\n throw createEEXIST(\"mkdir\", `/${logicalPath}`);\n }\n\n if (await tryRawFile(logicalPath)) {\n throw createEEXIST(\"mkdir\", `/${logicalPath}`);\n }\n\n if (await tryInferredDirectory(logicalPath)) {\n return;\n }\n\n const segments = logicalPath.split(\"/\").filter(Boolean);\n const targets = recursive\n ? segments.map((_, index) => segments.slice(0, index + 1).join(\"/\"))\n : [logicalPath];\n\n for (const target of targets) {\n const current = await tryMetadata(target);\n if (current) {\n if (current.kind !== \"directory\") {\n throw createENOTDIR(\"mkdir\", `/${target}`);\n }\n continue;\n }\n\n await ensureParentDirectory(target);\n const metadata = nowMetadata(\"directory\", 4096, normalizeMode(\"directory\", mode));\n await kvPut(scopedMetaKey(target), metadata);\n }\n}\n\nasync function rmdirEntry(logicalPath: string): Promise<void> {\n if (!logicalPath) {\n throw createEBUSY(\"rmdir\", \"/\");\n }\n\n const metadata = await ensureDirectory(logicalPath);\n const children = await collectDirChildren(logicalPath);\n if (children.length > 0) {\n throw createENOTEMPTY(\"rmdir\", `/${logicalPath}`);\n }\n\n await kvDelete(scopedMetaKey(logicalPath));\n}\n\nasync function unlinkEntry(logicalPath: string): Promise<void> {\n const metadata = await statPath(logicalPath);\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"unlink\", `/${logicalPath}`);\n }\n\n await kvDelete(scopedDataKey(logicalPath));\n try {\n await kvDelete(scopedMetaKey(logicalPath));\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nasync function renameEntry(oldLogicalPath: string, newLogicalPath: string): Promise<void> {\n const source = await statPath(oldLogicalPath);\n if (source.kind !== \"file\") {\n throw createEINVAL(\"rename\", `/${oldLogicalPath}`, \"directory rename is not supported in v1\");\n }\n\n const content = decodeEnvelope(await kvGet(scopedDataKey(oldLogicalPath)));\n await writeFileEntry(newLogicalPath, content, source.mode);\n await unlinkEntry(oldLogicalPath);\n}\n\nasync function initialize(init: TinyCloudVfsWorkerInit): Promise<void> {\n const node = new TinyCloudNode({ host: init.source.host });\n await node.restoreSession(init.source.session);\n\n const kv = node.kv as unknown as KvLike;\n const servicePrefix = init.source.kind === \"resolved-delegation\"\n ? normalizeStoragePrefix(init.source.kvPrefix)\n : normalizeStoragePrefix(kv.config?.prefix);\n const mountPrefix = normalizeStoragePrefix(init.mountPrefix);\n\n state.kv = kv;\n state.kvPrefix = servicePrefix;\n state.storageRoot = mountPrefix;\n}\n\nasync function handleRequest(request: WorkerRequest): Promise<WorkerResponse> {\n switch (request.type) {\n case \"init\":\n await initialize(request.init);\n return { ok: true, result: null };\n case \"stat\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const metadata = await statPath(logicalPath);\n return { ok: true, result: { metadata } };\n }\n case \"readFile\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const { content, metadata } = await readFileEntry(logicalPath);\n return { ok: true, result: { content, metadata } };\n }\n case \"writeFile\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await writeFileEntry(logicalPath, request.content, request.mode);\n return { ok: true, result: null };\n }\n case \"readdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const entries = await collectDirChildren(logicalPath);\n return { ok: true, result: { entries } };\n }\n case \"mkdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await mkdirEntry(logicalPath, request.recursive, request.mode);\n return { ok: true, result: null };\n }\n case \"rmdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await rmdirEntry(logicalPath);\n return { ok: true, result: null };\n }\n case \"unlink\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await unlinkEntry(logicalPath);\n return { ok: true, result: null };\n }\n case \"rename\": {\n const oldLogicalPath = ensureMountedLogicalPath(request.oldPath);\n const newLogicalPath = ensureMountedLogicalPath(request.newPath);\n await renameEntry(oldLogicalPath, newLogicalPath);\n return { ok: true, result: null };\n }\n default:\n throw createEINVAL(\"vfs\", \"/\");\n }\n}\n\nparentPort?.on(\"message\", async (message: { request: WorkerRequest; replyPort: MessagePort; waitBuffer: SharedArrayBuffer }) => {\n const view = new Int32Array(message.waitBuffer);\n\n try {\n const response = await handleRequest(message.request);\n message.replyPort.postMessage(response);\n } catch (error) {\n message.replyPort.postMessage(toWorkerError(error));\n } finally {\n Atomics.store(view, 0, 1);\n Atomics.notify(view, 0, 1);\n message.replyPort.close();\n }\n});\n","const ERRNO: Record<string, number> = {\n EPERM: -1,\n ENOENT: -2,\n EIO: -5,\n EBADF: -9,\n EACCES: -13,\n EBUSY: -16,\n EEXIST: -17,\n ENOTDIR: -20,\n EISDIR: -21,\n EINVAL: -22,\n ENOTEMPTY: -39,\n EROFS: -30,\n};\n\nexport function createNodeError(\n code: string,\n message: string,\n syscall: string,\n path?: string,\n): NodeJS.ErrnoException {\n const error = new Error(message) as NodeJS.ErrnoException;\n error.code = code;\n error.errno = ERRNO[code] ?? -1;\n error.syscall = syscall;\n if (path) {\n error.path = path;\n }\n return error;\n}\n\nexport function createENOENT(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOENT\", `no such file or directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEISDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EISDIR\", `illegal operation on a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTDIR\", `not a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTEMPTY\", `directory not empty, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEEXIST(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EEXIST\", `file already exists, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEACCES(syscall: string, path: string, message = \"permission denied\"): NodeJS.ErrnoException {\n return createNodeError(\"EACCES\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEROFS(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EROFS\", `read-only file system, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEIO(syscall: string, path: string, message: string): NodeJS.ErrnoException {\n return createNodeError(\"EIO\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEBUSY(syscall: string, path: string, message = \"resource busy or locked\"): NodeJS.ErrnoException {\n return createNodeError(\"EBUSY\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEINVAL(syscall: string, path: string, message = \"invalid argument\"): NodeJS.ErrnoException {\n return createNodeError(\"EINVAL\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function fromWorkerError(error: { code: string; message: string; syscall?: string; path?: string }): NodeJS.ErrnoException {\n return createNodeError(\n error.code,\n error.message,\n error.syscall ?? \"vfs\",\n error.path,\n );\n}\n","import { posix as pathPosix } from \"node:path\";\n\nexport const INTERNAL_META_PREFIX = \".tcvfs-meta\";\n\nexport function normalizeVfsPath(inputPath: string): string {\n const normalized = pathPosix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n const absolute = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n return absolute;\n}\n\nexport function toLogicalPath(inputPath: string): string {\n const normalized = normalizeVfsPath(inputPath);\n\n if (normalized.includes(\"\\0\")) {\n throw new Error(\"invalid path\");\n }\n\n if (normalized === \"/\") {\n return \"\";\n }\n\n const logical = normalized.slice(1);\n if (\n logical === INTERNAL_META_PREFIX ||\n logical.startsWith(`${INTERNAL_META_PREFIX}/`) ||\n logical.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\"path escapes virtual root\");\n }\n\n return logical;\n}\n\nexport function normalizeStoragePrefix(prefix?: string): string {\n if (!prefix) {\n return \"\";\n }\n\n return prefix\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nexport function joinStoragePath(...parts: Array<string | undefined>): string {\n const cleaned = parts\n .filter((part): part is string => Boolean(part))\n .map((part) => normalizeStoragePrefix(part));\n\n return cleaned.filter(Boolean).join(\"/\");\n}\n\nexport function dirnameOf(logicalPath: string): string {\n if (!logicalPath) {\n return \"\";\n }\n\n const dir = pathPosix.dirname(`/${logicalPath}`);\n return dir === \"/\" ? \"\" : dir.slice(1);\n}\n\nexport function basenameOf(logicalPath: string): string {\n return pathPosix.basename(logicalPath ? `/${logicalPath}` : \"/\");\n}\n","import { INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix } from \"./pathing\";\nimport type { TinyCloudVfsFileEnvelope, TinyCloudVfsMetadata } from \"./types\";\n\nexport function dataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, logicalPath);\n}\n\nexport function metadataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function metadataPrefix(storageRoot: string, logicalPath = \"\"): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function encodeEnvelope(content: Buffer): TinyCloudVfsFileEnvelope {\n return {\n version: 1,\n encoding: \"base64\",\n data: content.toString(\"base64\"),\n };\n}\n\nfunction isEnvelopeShape(value: unknown): value is TinyCloudVfsFileEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as TinyCloudVfsFileEnvelope).version === 1 &&\n (value as TinyCloudVfsFileEnvelope).encoding === \"base64\" &&\n typeof (value as TinyCloudVfsFileEnvelope).data === \"string\"\n );\n}\n\nexport function encodeFileValue(content: Buffer): string | TinyCloudVfsFileEnvelope {\n const utf8 = content.toString(\"utf8\");\n if (Buffer.from(utf8, \"utf8\").equals(content)) {\n return utf8;\n }\n\n return encodeEnvelope(content);\n}\n\nexport function decodeEnvelope(value: unknown): Buffer {\n if (isEnvelopeShape(value)) {\n return Buffer.from((value as TinyCloudVfsFileEnvelope).data, \"base64\");\n }\n\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isEnvelopeShape(parsed)) {\n return Buffer.from(parsed.data, \"base64\");\n }\n } catch {\n // Plain text payloads are expected and should fall through.\n }\n\n return Buffer.from(value, \"utf8\");\n }\n\n throw new Error(\"unsupported file payload\");\n}\n\nfunction isMetadataShape(value: unknown): value is TinyCloudVfsMetadata {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (((value as TinyCloudVfsMetadata).kind === \"file\") || ((value as TinyCloudVfsMetadata).kind === \"directory\")) &&\n typeof (value as TinyCloudVfsMetadata).size === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mode === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).ctimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mtimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).birthtimeMs === \"number\"\n );\n}\n\nexport function decodeMetadata(value: unknown): TinyCloudVfsMetadata {\n if (isMetadataShape(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown;\n if (isMetadataShape(parsed)) {\n return parsed;\n }\n }\n\n throw new Error(\"unsupported metadata payload\");\n}\n\nexport function nowMetadata(kind: \"file\" | \"directory\", size: number, mode: number, existing?: TinyCloudVfsMetadata): TinyCloudVfsMetadata {\n const now = Date.now();\n return {\n kind,\n size,\n mode,\n ctimeMs: now,\n mtimeMs: now,\n birthtimeMs: existing?.birthtimeMs ?? now,\n };\n}\n\nexport function normalizeMode(kind: \"file\" | \"directory\", mode?: number): number {\n if (typeof mode === \"number\" && Number.isFinite(mode)) {\n return mode;\n }\n\n return kind === \"directory\" ? 0o755 : 0o644;\n}\n\nexport function stripStoragePrefix(fullKey: string, prefix: string): string {\n const normalizedPrefix = normalizeStoragePrefix(prefix);\n if (!normalizedPrefix) {\n return fullKey.replace(/^\\/+/, \"\");\n }\n\n const withSlash = `${normalizedPrefix}/`;\n if (fullKey === normalizedPrefix) {\n return \"\";\n }\n\n if (fullKey.startsWith(withSlash)) {\n return fullKey.slice(withSlash.length);\n }\n\n return fullKey;\n}\n"],"mappings":"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","names":["pathPosix"]}
1
+ {"version":3,"sources":["../src/worker.ts","../src/errors.ts","../src/pathing.ts","../src/metadata.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport type { MessagePort } from \"node:worker_threads\";\nimport { TinyCloudNode } from \"@tinycloud/node-sdk\";\nimport { createEACCES, createEEXIST, createEIO, createEISDIR, createENOSPC, createENOTDIR, createENOTEMPTY, createENOENT, createEINVAL, createEBUSY } from \"./errors\";\nimport { dirnameOf, INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix, toLogicalPath } from \"./pathing\";\nimport { dataKey, decodeEnvelope, decodeMetadata, encodeFileValue, metadataKey, metadataPrefix, normalizeMode, nowMetadata, stripStoragePrefix } from \"./metadata\";\nimport type {\n TinyCloudVfsDirent,\n TinyCloudVfsMetadata,\n TinyCloudVfsSource,\n TinyCloudVfsWorkerInit,\n WorkerRequest,\n WorkerResponse,\n} from \"./types\";\n\ntype KvLike = {\n config?: { prefix?: string };\n get: (key: string, options?: Record<string, unknown>) => Promise<any>;\n put: (key: string, value: unknown, options?: Record<string, unknown>) => Promise<any>;\n list: (options?: Record<string, unknown>) => Promise<any>;\n delete: (key: string, options?: Record<string, unknown>) => Promise<any>;\n};\n\ninterface WorkerState {\n kv: KvLike | null;\n kvPrefix: string;\n storageRoot: string;\n}\n\nconst state: WorkerState = {\n kv: null,\n kvPrefix: \"\",\n storageRoot: \"\",\n};\n\nfunction toWorkerError(error: unknown): WorkerResponse {\n if (error && typeof error === \"object\" && \"code\" in error && \"message\" in error) {\n const typed = error as NodeJS.ErrnoException;\n return {\n ok: false,\n error: {\n code: typed.code ?? \"EIO\",\n message: typed.message,\n syscall: typed.syscall,\n path: typed.path,\n },\n };\n }\n\n return {\n ok: false,\n error: {\n code: \"EIO\",\n message: error instanceof Error ? error.message : String(error),\n syscall: \"vfs\",\n },\n };\n}\n\nfunction ensureKv(): KvLike {\n if (!state.kv) {\n throw createEIO(\"init\", \"/\", \"worker is not initialized\");\n }\n return state.kv;\n}\n\nfunction ensureMountedLogicalPath(inputPath: string): string {\n try {\n return toLogicalPath(inputPath);\n } catch {\n throw createENOENT(\"resolve\", inputPath);\n }\n}\n\nfunction effectiveStorageRoot(): string {\n return joinStoragePath(state.kvPrefix, state.storageRoot);\n}\n\nfunction effectiveStoragePath(logicalPath = \"\"): string {\n return joinStoragePath(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedDataKey(logicalPath: string): string {\n return dataKey(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedMetaKey(logicalPath: string): string {\n return metadataKey(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedMetaPrefix(logicalPath = \"\"): string {\n return metadataPrefix(effectiveStorageRoot(), logicalPath);\n}\n\nfunction effectiveListPrefix(logicalPath = \"\", options?: { trailingSlash?: boolean }): string {\n const prefix = effectiveStoragePath(logicalPath);\n if (!options?.trailingSlash || !prefix) {\n return prefix;\n }\n return prefix.endsWith(\"/\") ? prefix : `${prefix}/`;\n}\n\nasync function kvGet(key: string): Promise<unknown> {\n const kv = ensureKv();\n const result = await kv.get(key);\n if (!result.ok) {\n if (result.error?.code === \"KV_NOT_FOUND\") {\n throw createENOENT(\"get\", key);\n }\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"get\", key, result.error.message);\n }\n throw createEIO(\"get\", key, result.error?.message ?? \"kv get failed\");\n }\n\n return result.data.data;\n}\n\nasync function kvPut(key: string, value: unknown): Promise<void> {\n const kv = ensureKv();\n const result = await kv.put(key, value);\n if (!result.ok) {\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"put\", key, result.error.message);\n }\n if (result.error?.code === \"STORAGE_QUOTA_EXCEEDED\" || result.error?.code === \"STORAGE_LIMIT_REACHED\") {\n throw createENOSPC(\"put\", key);\n }\n throw createEIO(\"put\", key, result.error?.message ?? \"kv put failed\");\n }\n}\n\nasync function kvDelete(key: string): Promise<void> {\n const kv = ensureKv();\n const result = await kv.delete(key);\n if (!result.ok) {\n if (result.error?.code === \"KV_NOT_FOUND\") {\n throw createENOENT(\"unlink\", key);\n }\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"unlink\", key, result.error.message);\n }\n throw createEIO(\"unlink\", key, result.error?.message ?? \"kv delete failed\");\n }\n}\n\nasync function kvList(prefix: string): Promise<string[]> {\n const kv = ensureKv();\n const listOptions = prefix\n ? { prefix, removePrefix: false }\n : { removePrefix: false };\n const result = await kv.list(listOptions);\n if (!result.ok) {\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"scandir\", prefix, result.error.message);\n }\n throw createEIO(\"scandir\", prefix, result.error?.message ?? \"kv list failed\");\n }\n return result.data.keys ?? [];\n}\n\nasync function tryMetadata(logicalPath: string): Promise<TinyCloudVfsMetadata | null> {\n try {\n return decodeMetadata(await kvGet(scopedMetaKey(logicalPath)));\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function tryRawFile(logicalPath: string): Promise<{ content: Buffer; metadata: TinyCloudVfsMetadata } | null> {\n try {\n const content = decodeEnvelope(await kvGet(scopedDataKey(logicalPath)));\n const metadata = nowMetadata(\n \"file\",\n content.length,\n normalizeMode(\"file\"),\n );\n return { content, metadata };\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function listDescendantKeys(logicalPath: string): Promise<{ dataKeys: string[]; metaKeys: string[] }> {\n const dataPrefixValue = effectiveListPrefix(logicalPath, { trailingSlash: true });\n const metaPrefixValue = effectiveListPrefix(\n joinStoragePath(\".tcvfs-meta\", logicalPath),\n { trailingSlash: true },\n );\n\n const [dataKeys, metaKeys] = await Promise.all([\n kvList(dataPrefixValue),\n kvList(metaPrefixValue),\n ]);\n\n return { dataKeys, metaKeys };\n}\n\nasync function tryInferredDirectory(logicalPath: string): Promise<TinyCloudVfsMetadata | null> {\n const { dataKeys, metaKeys } = await listDescendantKeys(logicalPath);\n if (dataKeys.length === 0 && metaKeys.length === 0) {\n return null;\n }\n\n return nowMetadata(\n \"directory\",\n 4096,\n normalizeMode(\"directory\"),\n );\n}\n\nasync function ensureDirectory(logicalPath: string): Promise<TinyCloudVfsMetadata> {\n if (!logicalPath) {\n return nowMetadata(\"directory\", 4096, normalizeMode(\"directory\"));\n }\n\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n if (metadata.kind !== \"directory\") {\n throw createENOTDIR(\"stat\", `/${logicalPath}`);\n }\n return metadata;\n }\n\n const inferred = await tryInferredDirectory(logicalPath);\n if (!inferred) {\n throw createENOENT(\"stat\", `/${logicalPath}`);\n }\n return inferred;\n}\n\nasync function readFileEntry(logicalPath: string): Promise<{ content: Buffer; metadata: TinyCloudVfsMetadata }> {\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"open\", `/${logicalPath}`);\n }\n\n const content = decodeEnvelope(await kvGet(scopedDataKey(logicalPath)));\n return { content, metadata };\n }\n\n const rawFile = await tryRawFile(logicalPath);\n if (rawFile) {\n return rawFile;\n }\n\n if (await tryInferredDirectory(logicalPath)) {\n throw createEISDIR(\"open\", `/${logicalPath}`);\n }\n\n throw createENOENT(\"open\", `/${logicalPath}`);\n}\n\nasync function statPath(logicalPath: string): Promise<TinyCloudVfsMetadata> {\n if (!logicalPath) {\n return nowMetadata(\"directory\", 4096, normalizeMode(\"directory\"));\n }\n\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n return metadata;\n }\n\n const rawFile = await tryRawFile(logicalPath);\n if (rawFile) {\n return rawFile.metadata;\n }\n\n const inferredDirectory = await tryInferredDirectory(logicalPath);\n if (inferredDirectory) {\n return inferredDirectory;\n }\n\n throw createENOENT(\"stat\", `/${logicalPath}`);\n}\n\nasync function ensureParentDirectory(logicalPath: string): Promise<void> {\n const parent = dirnameOf(logicalPath);\n if (!parent) {\n return;\n }\n await ensureDirectory(parent);\n}\n\nasync function collectDirChildren(logicalPath: string): Promise<TinyCloudVfsDirent[]> {\n await ensureDirectory(logicalPath);\n\n const { dataKeys, metaKeys } = await listDescendantKeys(logicalPath);\n\n const names = new Set<string>();\n const relativePrefix = effectiveStoragePath(logicalPath);\n const relativeMetaPrefix = scopedMetaPrefix(logicalPath);\n\n for (const fullKey of dataKeys) {\n const relative = stripStoragePrefix(fullKey, relativePrefix);\n const first = relative.split(\"/\").filter(Boolean)[0];\n if (first) {\n names.add(first);\n }\n }\n\n for (const fullKey of metaKeys) {\n const relative = stripStoragePrefix(fullKey, relativeMetaPrefix);\n const first = relative.split(\"/\").filter(Boolean)[0];\n if (first) {\n names.add(first);\n }\n }\n\n const entries = await Promise.all(\n [...names]\n .filter((name) => name !== INTERNAL_META_PREFIX)\n .sort()\n .map(async (name): Promise<TinyCloudVfsDirent> => {\n const childPath = joinStoragePath(logicalPath, name);\n const metadata = await statPath(childPath);\n return {\n name,\n kind: metadata.kind,\n parentPath: logicalPath ? `/${logicalPath}` : \"/\",\n };\n }),\n );\n\n return entries;\n}\n\nasync function writeFileEntry(logicalPath: string, content: Uint8Array, mode?: number): Promise<TinyCloudVfsMetadata> {\n await ensureParentDirectory(logicalPath);\n const existing = await tryMetadata(logicalPath);\n if (existing) {\n if (existing.kind !== \"file\") {\n throw createEISDIR(\"writeFile\", `/${logicalPath}`);\n }\n } else if (await tryInferredDirectory(logicalPath)) {\n throw createEISDIR(\"writeFile\", `/${logicalPath}`);\n }\n\n const buffer = Buffer.from(content);\n const metadata = nowMetadata(\n \"file\",\n buffer.length,\n normalizeMode(\"file\", mode ?? existing?.mode),\n existing ?? undefined,\n );\n\n await kvPut(scopedDataKey(logicalPath), encodeFileValue(buffer));\n await kvPut(scopedMetaKey(logicalPath), metadata);\n return metadata;\n}\n\nasync function mkdirEntry(logicalPath: string, recursive = false, mode?: number): Promise<void> {\n if (!logicalPath) {\n return;\n }\n\n const existing = await tryMetadata(logicalPath);\n if (existing) {\n if (existing.kind === \"directory\") {\n return;\n }\n throw createEEXIST(\"mkdir\", `/${logicalPath}`);\n }\n\n if (await tryRawFile(logicalPath)) {\n throw createEEXIST(\"mkdir\", `/${logicalPath}`);\n }\n\n if (await tryInferredDirectory(logicalPath)) {\n return;\n }\n\n const segments = logicalPath.split(\"/\").filter(Boolean);\n const targets = recursive\n ? segments.map((_, index) => segments.slice(0, index + 1).join(\"/\"))\n : [logicalPath];\n\n for (const target of targets) {\n const current = await tryMetadata(target);\n if (current) {\n if (current.kind !== \"directory\") {\n throw createENOTDIR(\"mkdir\", `/${target}`);\n }\n continue;\n }\n\n await ensureParentDirectory(target);\n const metadata = nowMetadata(\"directory\", 4096, normalizeMode(\"directory\", mode));\n await kvPut(scopedMetaKey(target), metadata);\n }\n}\n\nasync function rmdirEntry(logicalPath: string): Promise<void> {\n if (!logicalPath) {\n throw createEBUSY(\"rmdir\", \"/\");\n }\n\n const metadata = await ensureDirectory(logicalPath);\n const children = await collectDirChildren(logicalPath);\n if (children.length > 0) {\n throw createENOTEMPTY(\"rmdir\", `/${logicalPath}`);\n }\n\n await kvDelete(scopedMetaKey(logicalPath));\n}\n\nasync function unlinkEntry(logicalPath: string): Promise<void> {\n const metadata = await statPath(logicalPath);\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"unlink\", `/${logicalPath}`);\n }\n\n await kvDelete(scopedDataKey(logicalPath));\n try {\n await kvDelete(scopedMetaKey(logicalPath));\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nasync function renameEntry(oldLogicalPath: string, newLogicalPath: string): Promise<void> {\n const source = await statPath(oldLogicalPath);\n if (source.kind !== \"file\") {\n throw createEINVAL(\"rename\", `/${oldLogicalPath}`, \"directory rename is not supported in v1\");\n }\n\n const content = decodeEnvelope(await kvGet(scopedDataKey(oldLogicalPath)));\n await writeFileEntry(newLogicalPath, content, source.mode);\n await unlinkEntry(oldLogicalPath);\n}\n\nasync function initialize(init: TinyCloudVfsWorkerInit): Promise<void> {\n const node = new TinyCloudNode({ host: init.source.host });\n await node.restoreSession(init.source.session);\n\n const kv = node.kv as unknown as KvLike;\n const servicePrefix = init.source.kind === \"resolved-delegation\"\n ? normalizeStoragePrefix(init.source.kvPrefix)\n : normalizeStoragePrefix(kv.config?.prefix);\n const mountPrefix = normalizeStoragePrefix(init.mountPrefix);\n\n state.kv = kv;\n state.kvPrefix = servicePrefix;\n state.storageRoot = mountPrefix;\n}\n\nasync function handleRequest(request: WorkerRequest): Promise<WorkerResponse> {\n switch (request.type) {\n case \"init\":\n await initialize(request.init);\n return { ok: true, result: null };\n case \"stat\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const metadata = await statPath(logicalPath);\n return { ok: true, result: { metadata } };\n }\n case \"readFile\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const { content, metadata } = await readFileEntry(logicalPath);\n return { ok: true, result: { content, metadata } };\n }\n case \"writeFile\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await writeFileEntry(logicalPath, request.content, request.mode);\n return { ok: true, result: null };\n }\n case \"readdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const entries = await collectDirChildren(logicalPath);\n return { ok: true, result: { entries } };\n }\n case \"mkdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await mkdirEntry(logicalPath, request.recursive, request.mode);\n return { ok: true, result: null };\n }\n case \"rmdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await rmdirEntry(logicalPath);\n return { ok: true, result: null };\n }\n case \"unlink\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await unlinkEntry(logicalPath);\n return { ok: true, result: null };\n }\n case \"rename\": {\n const oldLogicalPath = ensureMountedLogicalPath(request.oldPath);\n const newLogicalPath = ensureMountedLogicalPath(request.newPath);\n await renameEntry(oldLogicalPath, newLogicalPath);\n return { ok: true, result: null };\n }\n default:\n throw createEINVAL(\"vfs\", \"/\");\n }\n}\n\nparentPort?.on(\"message\", async (message: { request: WorkerRequest; replyPort: MessagePort; waitBuffer: SharedArrayBuffer }) => {\n const view = new Int32Array(message.waitBuffer);\n\n try {\n const response = await handleRequest(message.request);\n message.replyPort.postMessage(response);\n } catch (error) {\n message.replyPort.postMessage(toWorkerError(error));\n } finally {\n Atomics.store(view, 0, 1);\n Atomics.notify(view, 0, 1);\n message.replyPort.close();\n }\n});\n","const ERRNO: Record<string, number> = {\n EPERM: -1,\n ENOENT: -2,\n EIO: -5,\n EBADF: -9,\n EACCES: -13,\n EBUSY: -16,\n EEXIST: -17,\n ENOTDIR: -20,\n EISDIR: -21,\n EINVAL: -22,\n ENOTEMPTY: -39,\n ENOSPC: -28,\n EROFS: -30,\n};\n\nexport function createNodeError(\n code: string,\n message: string,\n syscall: string,\n path?: string,\n): NodeJS.ErrnoException {\n const error = new Error(message) as NodeJS.ErrnoException;\n error.code = code;\n error.errno = ERRNO[code] ?? -1;\n error.syscall = syscall;\n if (path) {\n error.path = path;\n }\n return error;\n}\n\nexport function createENOENT(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOENT\", `no such file or directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEISDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EISDIR\", `illegal operation on a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTDIR\", `not a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTEMPTY\", `directory not empty, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEEXIST(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EEXIST\", `file already exists, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEACCES(syscall: string, path: string, message = \"permission denied\"): NodeJS.ErrnoException {\n return createNodeError(\"EACCES\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEROFS(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EROFS\", `read-only file system, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEIO(syscall: string, path: string, message: string): NodeJS.ErrnoException {\n return createNodeError(\"EIO\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\n/** The owner's TinyCloud storage is full (or too small for this write); nothing was written. */\nexport function createENOSPC(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOSPC\", `TinyCloud storage is full; nothing was written, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEBUSY(syscall: string, path: string, message = \"resource busy or locked\"): NodeJS.ErrnoException {\n return createNodeError(\"EBUSY\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEINVAL(syscall: string, path: string, message = \"invalid argument\"): NodeJS.ErrnoException {\n return createNodeError(\"EINVAL\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function fromWorkerError(error: { code: string; message: string; syscall?: string; path?: string }): NodeJS.ErrnoException {\n return createNodeError(\n error.code,\n error.message,\n error.syscall ?? \"vfs\",\n error.path,\n );\n}\n","import { posix as pathPosix } from \"node:path\";\n\nexport const INTERNAL_META_PREFIX = \".tcvfs-meta\";\n\nexport function normalizeVfsPath(inputPath: string): string {\n const normalized = pathPosix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n const absolute = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n return absolute;\n}\n\nexport function toLogicalPath(inputPath: string): string {\n const normalized = normalizeVfsPath(inputPath);\n\n if (normalized.includes(\"\\0\")) {\n throw new Error(\"invalid path\");\n }\n\n if (normalized === \"/\") {\n return \"\";\n }\n\n const logical = normalized.slice(1);\n if (\n logical === INTERNAL_META_PREFIX ||\n logical.startsWith(`${INTERNAL_META_PREFIX}/`) ||\n logical.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\"path escapes virtual root\");\n }\n\n return logical;\n}\n\nexport function normalizeStoragePrefix(prefix?: string): string {\n if (!prefix) {\n return \"\";\n }\n\n return prefix\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nexport function joinStoragePath(...parts: Array<string | undefined>): string {\n const cleaned = parts\n .filter((part): part is string => Boolean(part))\n .map((part) => normalizeStoragePrefix(part));\n\n return cleaned.filter(Boolean).join(\"/\");\n}\n\nexport function dirnameOf(logicalPath: string): string {\n if (!logicalPath) {\n return \"\";\n }\n\n const dir = pathPosix.dirname(`/${logicalPath}`);\n return dir === \"/\" ? \"\" : dir.slice(1);\n}\n\nexport function basenameOf(logicalPath: string): string {\n return pathPosix.basename(logicalPath ? `/${logicalPath}` : \"/\");\n}\n","import { INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix } from \"./pathing\";\nimport type { TinyCloudVfsFileEnvelope, TinyCloudVfsMetadata } from \"./types\";\n\nexport function dataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, logicalPath);\n}\n\nexport function metadataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function metadataPrefix(storageRoot: string, logicalPath = \"\"): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function encodeEnvelope(content: Buffer): TinyCloudVfsFileEnvelope {\n return {\n version: 1,\n encoding: \"base64\",\n data: content.toString(\"base64\"),\n };\n}\n\nfunction isEnvelopeShape(value: unknown): value is TinyCloudVfsFileEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as TinyCloudVfsFileEnvelope).version === 1 &&\n (value as TinyCloudVfsFileEnvelope).encoding === \"base64\" &&\n typeof (value as TinyCloudVfsFileEnvelope).data === \"string\"\n );\n}\n\nexport function encodeFileValue(content: Buffer): string | TinyCloudVfsFileEnvelope {\n const utf8 = content.toString(\"utf8\");\n if (Buffer.from(utf8, \"utf8\").equals(content)) {\n return utf8;\n }\n\n return encodeEnvelope(content);\n}\n\nexport function decodeEnvelope(value: unknown): Buffer {\n if (isEnvelopeShape(value)) {\n return Buffer.from((value as TinyCloudVfsFileEnvelope).data, \"base64\");\n }\n\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isEnvelopeShape(parsed)) {\n return Buffer.from(parsed.data, \"base64\");\n }\n } catch {\n // Plain text payloads are expected and should fall through.\n }\n\n return Buffer.from(value, \"utf8\");\n }\n\n throw new Error(\"unsupported file payload\");\n}\n\nfunction isMetadataShape(value: unknown): value is TinyCloudVfsMetadata {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (((value as TinyCloudVfsMetadata).kind === \"file\") || ((value as TinyCloudVfsMetadata).kind === \"directory\")) &&\n typeof (value as TinyCloudVfsMetadata).size === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mode === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).ctimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mtimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).birthtimeMs === \"number\"\n );\n}\n\nexport function decodeMetadata(value: unknown): TinyCloudVfsMetadata {\n if (isMetadataShape(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown;\n if (isMetadataShape(parsed)) {\n return parsed;\n }\n }\n\n throw new Error(\"unsupported metadata payload\");\n}\n\nexport function nowMetadata(kind: \"file\" | \"directory\", size: number, mode: number, existing?: TinyCloudVfsMetadata): TinyCloudVfsMetadata {\n const now = Date.now();\n return {\n kind,\n size,\n mode,\n ctimeMs: now,\n mtimeMs: now,\n birthtimeMs: existing?.birthtimeMs ?? now,\n };\n}\n\nexport function normalizeMode(kind: \"file\" | \"directory\", mode?: number): number {\n if (typeof mode === \"number\" && Number.isFinite(mode)) {\n return mode;\n }\n\n return kind === \"directory\" ? 0o755 : 0o644;\n}\n\nexport function stripStoragePrefix(fullKey: string, prefix: string): string {\n const normalizedPrefix = normalizeStoragePrefix(prefix);\n if (!normalizedPrefix) {\n return fullKey.replace(/^\\/+/, \"\");\n }\n\n const withSlash = `${normalizedPrefix}/`;\n if (fullKey === normalizedPrefix) {\n return \"\";\n }\n\n if (fullKey.startsWith(withSlash)) {\n return fullKey.slice(withSlash.length);\n }\n\n return fullKey;\n}\n"],"mappings":"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","names":["pathPosix"]}
package/dist/worker.js CHANGED
@@ -15,6 +15,7 @@ var ERRNO = {
15
15
  EISDIR: -21,
16
16
  EINVAL: -22,
17
17
  ENOTEMPTY: -39,
18
+ ENOSPC: -28,
18
19
  EROFS: -30
19
20
  };
20
21
  function createNodeError(code, message, syscall, path) {
@@ -48,6 +49,9 @@ function createEACCES(syscall, path, message = "permission denied") {
48
49
  function createEIO(syscall, path, message) {
49
50
  return createNodeError("EIO", `${message}, ${syscall} '${path}'`, syscall, path);
50
51
  }
52
+ function createENOSPC(syscall, path) {
53
+ return createNodeError("ENOSPC", `TinyCloud storage is full; nothing was written, ${syscall} '${path}'`, syscall, path);
54
+ }
51
55
  function createEBUSY(syscall, path, message = "resource busy or locked") {
52
56
  return createNodeError("EBUSY", `${message}, ${syscall} '${path}'`, syscall, path);
53
57
  }
@@ -273,6 +277,9 @@ async function kvPut(key, value) {
273
277
  if (result.error?.code === "AUTH_UNAUTHORIZED") {
274
278
  throw createEACCES("put", key, result.error.message);
275
279
  }
280
+ if (result.error?.code === "STORAGE_QUOTA_EXCEEDED" || result.error?.code === "STORAGE_LIMIT_REACHED") {
281
+ throw createENOSPC("put", key);
282
+ }
276
283
  throw createEIO("put", key, result.error?.message ?? "kv put failed");
277
284
  }
278
285
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/worker.ts","../src/errors.ts","../src/pathing.ts","../src/metadata.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport type { MessagePort } from \"node:worker_threads\";\nimport { TinyCloudNode } from \"@tinycloud/node-sdk\";\nimport { createEACCES, createEEXIST, createEIO, createEISDIR, createENOTDIR, createENOTEMPTY, createENOENT, createEINVAL, createEBUSY } from \"./errors\";\nimport { dirnameOf, INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix, toLogicalPath } from \"./pathing\";\nimport { dataKey, decodeEnvelope, decodeMetadata, encodeFileValue, metadataKey, metadataPrefix, normalizeMode, nowMetadata, stripStoragePrefix } from \"./metadata\";\nimport type {\n TinyCloudVfsDirent,\n TinyCloudVfsMetadata,\n TinyCloudVfsSource,\n TinyCloudVfsWorkerInit,\n WorkerRequest,\n WorkerResponse,\n} from \"./types\";\n\ntype KvLike = {\n config?: { prefix?: string };\n get: (key: string, options?: Record<string, unknown>) => Promise<any>;\n put: (key: string, value: unknown, options?: Record<string, unknown>) => Promise<any>;\n list: (options?: Record<string, unknown>) => Promise<any>;\n delete: (key: string, options?: Record<string, unknown>) => Promise<any>;\n};\n\ninterface WorkerState {\n kv: KvLike | null;\n kvPrefix: string;\n storageRoot: string;\n}\n\nconst state: WorkerState = {\n kv: null,\n kvPrefix: \"\",\n storageRoot: \"\",\n};\n\nfunction toWorkerError(error: unknown): WorkerResponse {\n if (error && typeof error === \"object\" && \"code\" in error && \"message\" in error) {\n const typed = error as NodeJS.ErrnoException;\n return {\n ok: false,\n error: {\n code: typed.code ?? \"EIO\",\n message: typed.message,\n syscall: typed.syscall,\n path: typed.path,\n },\n };\n }\n\n return {\n ok: false,\n error: {\n code: \"EIO\",\n message: error instanceof Error ? error.message : String(error),\n syscall: \"vfs\",\n },\n };\n}\n\nfunction ensureKv(): KvLike {\n if (!state.kv) {\n throw createEIO(\"init\", \"/\", \"worker is not initialized\");\n }\n return state.kv;\n}\n\nfunction ensureMountedLogicalPath(inputPath: string): string {\n try {\n return toLogicalPath(inputPath);\n } catch {\n throw createENOENT(\"resolve\", inputPath);\n }\n}\n\nfunction effectiveStorageRoot(): string {\n return joinStoragePath(state.kvPrefix, state.storageRoot);\n}\n\nfunction effectiveStoragePath(logicalPath = \"\"): string {\n return joinStoragePath(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedDataKey(logicalPath: string): string {\n return dataKey(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedMetaKey(logicalPath: string): string {\n return metadataKey(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedMetaPrefix(logicalPath = \"\"): string {\n return metadataPrefix(effectiveStorageRoot(), logicalPath);\n}\n\nfunction effectiveListPrefix(logicalPath = \"\", options?: { trailingSlash?: boolean }): string {\n const prefix = effectiveStoragePath(logicalPath);\n if (!options?.trailingSlash || !prefix) {\n return prefix;\n }\n return prefix.endsWith(\"/\") ? prefix : `${prefix}/`;\n}\n\nasync function kvGet(key: string): Promise<unknown> {\n const kv = ensureKv();\n const result = await kv.get(key);\n if (!result.ok) {\n if (result.error?.code === \"KV_NOT_FOUND\") {\n throw createENOENT(\"get\", key);\n }\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"get\", key, result.error.message);\n }\n throw createEIO(\"get\", key, result.error?.message ?? \"kv get failed\");\n }\n\n return result.data.data;\n}\n\nasync function kvPut(key: string, value: unknown): Promise<void> {\n const kv = ensureKv();\n const result = await kv.put(key, value);\n if (!result.ok) {\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"put\", key, result.error.message);\n }\n throw createEIO(\"put\", key, result.error?.message ?? \"kv put failed\");\n }\n}\n\nasync function kvDelete(key: string): Promise<void> {\n const kv = ensureKv();\n const result = await kv.delete(key);\n if (!result.ok) {\n if (result.error?.code === \"KV_NOT_FOUND\") {\n throw createENOENT(\"unlink\", key);\n }\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"unlink\", key, result.error.message);\n }\n throw createEIO(\"unlink\", key, result.error?.message ?? \"kv delete failed\");\n }\n}\n\nasync function kvList(prefix: string): Promise<string[]> {\n const kv = ensureKv();\n const listOptions = prefix\n ? { prefix, removePrefix: false }\n : { removePrefix: false };\n const result = await kv.list(listOptions);\n if (!result.ok) {\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"scandir\", prefix, result.error.message);\n }\n throw createEIO(\"scandir\", prefix, result.error?.message ?? \"kv list failed\");\n }\n return result.data.keys ?? [];\n}\n\nasync function tryMetadata(logicalPath: string): Promise<TinyCloudVfsMetadata | null> {\n try {\n return decodeMetadata(await kvGet(scopedMetaKey(logicalPath)));\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function tryRawFile(logicalPath: string): Promise<{ content: Buffer; metadata: TinyCloudVfsMetadata } | null> {\n try {\n const content = decodeEnvelope(await kvGet(scopedDataKey(logicalPath)));\n const metadata = nowMetadata(\n \"file\",\n content.length,\n normalizeMode(\"file\"),\n );\n return { content, metadata };\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function listDescendantKeys(logicalPath: string): Promise<{ dataKeys: string[]; metaKeys: string[] }> {\n const dataPrefixValue = effectiveListPrefix(logicalPath, { trailingSlash: true });\n const metaPrefixValue = effectiveListPrefix(\n joinStoragePath(\".tcvfs-meta\", logicalPath),\n { trailingSlash: true },\n );\n\n const [dataKeys, metaKeys] = await Promise.all([\n kvList(dataPrefixValue),\n kvList(metaPrefixValue),\n ]);\n\n return { dataKeys, metaKeys };\n}\n\nasync function tryInferredDirectory(logicalPath: string): Promise<TinyCloudVfsMetadata | null> {\n const { dataKeys, metaKeys } = await listDescendantKeys(logicalPath);\n if (dataKeys.length === 0 && metaKeys.length === 0) {\n return null;\n }\n\n return nowMetadata(\n \"directory\",\n 4096,\n normalizeMode(\"directory\"),\n );\n}\n\nasync function ensureDirectory(logicalPath: string): Promise<TinyCloudVfsMetadata> {\n if (!logicalPath) {\n return nowMetadata(\"directory\", 4096, normalizeMode(\"directory\"));\n }\n\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n if (metadata.kind !== \"directory\") {\n throw createENOTDIR(\"stat\", `/${logicalPath}`);\n }\n return metadata;\n }\n\n const inferred = await tryInferredDirectory(logicalPath);\n if (!inferred) {\n throw createENOENT(\"stat\", `/${logicalPath}`);\n }\n return inferred;\n}\n\nasync function readFileEntry(logicalPath: string): Promise<{ content: Buffer; metadata: TinyCloudVfsMetadata }> {\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"open\", `/${logicalPath}`);\n }\n\n const content = decodeEnvelope(await kvGet(scopedDataKey(logicalPath)));\n return { content, metadata };\n }\n\n const rawFile = await tryRawFile(logicalPath);\n if (rawFile) {\n return rawFile;\n }\n\n if (await tryInferredDirectory(logicalPath)) {\n throw createEISDIR(\"open\", `/${logicalPath}`);\n }\n\n throw createENOENT(\"open\", `/${logicalPath}`);\n}\n\nasync function statPath(logicalPath: string): Promise<TinyCloudVfsMetadata> {\n if (!logicalPath) {\n return nowMetadata(\"directory\", 4096, normalizeMode(\"directory\"));\n }\n\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n return metadata;\n }\n\n const rawFile = await tryRawFile(logicalPath);\n if (rawFile) {\n return rawFile.metadata;\n }\n\n const inferredDirectory = await tryInferredDirectory(logicalPath);\n if (inferredDirectory) {\n return inferredDirectory;\n }\n\n throw createENOENT(\"stat\", `/${logicalPath}`);\n}\n\nasync function ensureParentDirectory(logicalPath: string): Promise<void> {\n const parent = dirnameOf(logicalPath);\n if (!parent) {\n return;\n }\n await ensureDirectory(parent);\n}\n\nasync function collectDirChildren(logicalPath: string): Promise<TinyCloudVfsDirent[]> {\n await ensureDirectory(logicalPath);\n\n const { dataKeys, metaKeys } = await listDescendantKeys(logicalPath);\n\n const names = new Set<string>();\n const relativePrefix = effectiveStoragePath(logicalPath);\n const relativeMetaPrefix = scopedMetaPrefix(logicalPath);\n\n for (const fullKey of dataKeys) {\n const relative = stripStoragePrefix(fullKey, relativePrefix);\n const first = relative.split(\"/\").filter(Boolean)[0];\n if (first) {\n names.add(first);\n }\n }\n\n for (const fullKey of metaKeys) {\n const relative = stripStoragePrefix(fullKey, relativeMetaPrefix);\n const first = relative.split(\"/\").filter(Boolean)[0];\n if (first) {\n names.add(first);\n }\n }\n\n const entries = await Promise.all(\n [...names]\n .filter((name) => name !== INTERNAL_META_PREFIX)\n .sort()\n .map(async (name): Promise<TinyCloudVfsDirent> => {\n const childPath = joinStoragePath(logicalPath, name);\n const metadata = await statPath(childPath);\n return {\n name,\n kind: metadata.kind,\n parentPath: logicalPath ? `/${logicalPath}` : \"/\",\n };\n }),\n );\n\n return entries;\n}\n\nasync function writeFileEntry(logicalPath: string, content: Uint8Array, mode?: number): Promise<TinyCloudVfsMetadata> {\n await ensureParentDirectory(logicalPath);\n const existing = await tryMetadata(logicalPath);\n if (existing) {\n if (existing.kind !== \"file\") {\n throw createEISDIR(\"writeFile\", `/${logicalPath}`);\n }\n } else if (await tryInferredDirectory(logicalPath)) {\n throw createEISDIR(\"writeFile\", `/${logicalPath}`);\n }\n\n const buffer = Buffer.from(content);\n const metadata = nowMetadata(\n \"file\",\n buffer.length,\n normalizeMode(\"file\", mode ?? existing?.mode),\n existing ?? undefined,\n );\n\n await kvPut(scopedDataKey(logicalPath), encodeFileValue(buffer));\n await kvPut(scopedMetaKey(logicalPath), metadata);\n return metadata;\n}\n\nasync function mkdirEntry(logicalPath: string, recursive = false, mode?: number): Promise<void> {\n if (!logicalPath) {\n return;\n }\n\n const existing = await tryMetadata(logicalPath);\n if (existing) {\n if (existing.kind === \"directory\") {\n return;\n }\n throw createEEXIST(\"mkdir\", `/${logicalPath}`);\n }\n\n if (await tryRawFile(logicalPath)) {\n throw createEEXIST(\"mkdir\", `/${logicalPath}`);\n }\n\n if (await tryInferredDirectory(logicalPath)) {\n return;\n }\n\n const segments = logicalPath.split(\"/\").filter(Boolean);\n const targets = recursive\n ? segments.map((_, index) => segments.slice(0, index + 1).join(\"/\"))\n : [logicalPath];\n\n for (const target of targets) {\n const current = await tryMetadata(target);\n if (current) {\n if (current.kind !== \"directory\") {\n throw createENOTDIR(\"mkdir\", `/${target}`);\n }\n continue;\n }\n\n await ensureParentDirectory(target);\n const metadata = nowMetadata(\"directory\", 4096, normalizeMode(\"directory\", mode));\n await kvPut(scopedMetaKey(target), metadata);\n }\n}\n\nasync function rmdirEntry(logicalPath: string): Promise<void> {\n if (!logicalPath) {\n throw createEBUSY(\"rmdir\", \"/\");\n }\n\n const metadata = await ensureDirectory(logicalPath);\n const children = await collectDirChildren(logicalPath);\n if (children.length > 0) {\n throw createENOTEMPTY(\"rmdir\", `/${logicalPath}`);\n }\n\n await kvDelete(scopedMetaKey(logicalPath));\n}\n\nasync function unlinkEntry(logicalPath: string): Promise<void> {\n const metadata = await statPath(logicalPath);\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"unlink\", `/${logicalPath}`);\n }\n\n await kvDelete(scopedDataKey(logicalPath));\n try {\n await kvDelete(scopedMetaKey(logicalPath));\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nasync function renameEntry(oldLogicalPath: string, newLogicalPath: string): Promise<void> {\n const source = await statPath(oldLogicalPath);\n if (source.kind !== \"file\") {\n throw createEINVAL(\"rename\", `/${oldLogicalPath}`, \"directory rename is not supported in v1\");\n }\n\n const content = decodeEnvelope(await kvGet(scopedDataKey(oldLogicalPath)));\n await writeFileEntry(newLogicalPath, content, source.mode);\n await unlinkEntry(oldLogicalPath);\n}\n\nasync function initialize(init: TinyCloudVfsWorkerInit): Promise<void> {\n const node = new TinyCloudNode({ host: init.source.host });\n await node.restoreSession(init.source.session);\n\n const kv = node.kv as unknown as KvLike;\n const servicePrefix = init.source.kind === \"resolved-delegation\"\n ? normalizeStoragePrefix(init.source.kvPrefix)\n : normalizeStoragePrefix(kv.config?.prefix);\n const mountPrefix = normalizeStoragePrefix(init.mountPrefix);\n\n state.kv = kv;\n state.kvPrefix = servicePrefix;\n state.storageRoot = mountPrefix;\n}\n\nasync function handleRequest(request: WorkerRequest): Promise<WorkerResponse> {\n switch (request.type) {\n case \"init\":\n await initialize(request.init);\n return { ok: true, result: null };\n case \"stat\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const metadata = await statPath(logicalPath);\n return { ok: true, result: { metadata } };\n }\n case \"readFile\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const { content, metadata } = await readFileEntry(logicalPath);\n return { ok: true, result: { content, metadata } };\n }\n case \"writeFile\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await writeFileEntry(logicalPath, request.content, request.mode);\n return { ok: true, result: null };\n }\n case \"readdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const entries = await collectDirChildren(logicalPath);\n return { ok: true, result: { entries } };\n }\n case \"mkdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await mkdirEntry(logicalPath, request.recursive, request.mode);\n return { ok: true, result: null };\n }\n case \"rmdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await rmdirEntry(logicalPath);\n return { ok: true, result: null };\n }\n case \"unlink\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await unlinkEntry(logicalPath);\n return { ok: true, result: null };\n }\n case \"rename\": {\n const oldLogicalPath = ensureMountedLogicalPath(request.oldPath);\n const newLogicalPath = ensureMountedLogicalPath(request.newPath);\n await renameEntry(oldLogicalPath, newLogicalPath);\n return { ok: true, result: null };\n }\n default:\n throw createEINVAL(\"vfs\", \"/\");\n }\n}\n\nparentPort?.on(\"message\", async (message: { request: WorkerRequest; replyPort: MessagePort; waitBuffer: SharedArrayBuffer }) => {\n const view = new Int32Array(message.waitBuffer);\n\n try {\n const response = await handleRequest(message.request);\n message.replyPort.postMessage(response);\n } catch (error) {\n message.replyPort.postMessage(toWorkerError(error));\n } finally {\n Atomics.store(view, 0, 1);\n Atomics.notify(view, 0, 1);\n message.replyPort.close();\n }\n});\n","const ERRNO: Record<string, number> = {\n EPERM: -1,\n ENOENT: -2,\n EIO: -5,\n EBADF: -9,\n EACCES: -13,\n EBUSY: -16,\n EEXIST: -17,\n ENOTDIR: -20,\n EISDIR: -21,\n EINVAL: -22,\n ENOTEMPTY: -39,\n EROFS: -30,\n};\n\nexport function createNodeError(\n code: string,\n message: string,\n syscall: string,\n path?: string,\n): NodeJS.ErrnoException {\n const error = new Error(message) as NodeJS.ErrnoException;\n error.code = code;\n error.errno = ERRNO[code] ?? -1;\n error.syscall = syscall;\n if (path) {\n error.path = path;\n }\n return error;\n}\n\nexport function createENOENT(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOENT\", `no such file or directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEISDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EISDIR\", `illegal operation on a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTDIR\", `not a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTEMPTY\", `directory not empty, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEEXIST(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EEXIST\", `file already exists, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEACCES(syscall: string, path: string, message = \"permission denied\"): NodeJS.ErrnoException {\n return createNodeError(\"EACCES\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEROFS(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EROFS\", `read-only file system, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEIO(syscall: string, path: string, message: string): NodeJS.ErrnoException {\n return createNodeError(\"EIO\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEBUSY(syscall: string, path: string, message = \"resource busy or locked\"): NodeJS.ErrnoException {\n return createNodeError(\"EBUSY\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEINVAL(syscall: string, path: string, message = \"invalid argument\"): NodeJS.ErrnoException {\n return createNodeError(\"EINVAL\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function fromWorkerError(error: { code: string; message: string; syscall?: string; path?: string }): NodeJS.ErrnoException {\n return createNodeError(\n error.code,\n error.message,\n error.syscall ?? \"vfs\",\n error.path,\n );\n}\n","import { posix as pathPosix } from \"node:path\";\n\nexport const INTERNAL_META_PREFIX = \".tcvfs-meta\";\n\nexport function normalizeVfsPath(inputPath: string): string {\n const normalized = pathPosix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n const absolute = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n return absolute;\n}\n\nexport function toLogicalPath(inputPath: string): string {\n const normalized = normalizeVfsPath(inputPath);\n\n if (normalized.includes(\"\\0\")) {\n throw new Error(\"invalid path\");\n }\n\n if (normalized === \"/\") {\n return \"\";\n }\n\n const logical = normalized.slice(1);\n if (\n logical === INTERNAL_META_PREFIX ||\n logical.startsWith(`${INTERNAL_META_PREFIX}/`) ||\n logical.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\"path escapes virtual root\");\n }\n\n return logical;\n}\n\nexport function normalizeStoragePrefix(prefix?: string): string {\n if (!prefix) {\n return \"\";\n }\n\n return prefix\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nexport function joinStoragePath(...parts: Array<string | undefined>): string {\n const cleaned = parts\n .filter((part): part is string => Boolean(part))\n .map((part) => normalizeStoragePrefix(part));\n\n return cleaned.filter(Boolean).join(\"/\");\n}\n\nexport function dirnameOf(logicalPath: string): string {\n if (!logicalPath) {\n return \"\";\n }\n\n const dir = pathPosix.dirname(`/${logicalPath}`);\n return dir === \"/\" ? \"\" : dir.slice(1);\n}\n\nexport function basenameOf(logicalPath: string): string {\n return pathPosix.basename(logicalPath ? `/${logicalPath}` : \"/\");\n}\n","import { INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix } from \"./pathing\";\nimport type { TinyCloudVfsFileEnvelope, TinyCloudVfsMetadata } from \"./types\";\n\nexport function dataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, logicalPath);\n}\n\nexport function metadataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function metadataPrefix(storageRoot: string, logicalPath = \"\"): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function encodeEnvelope(content: Buffer): TinyCloudVfsFileEnvelope {\n return {\n version: 1,\n encoding: \"base64\",\n data: content.toString(\"base64\"),\n };\n}\n\nfunction isEnvelopeShape(value: unknown): value is TinyCloudVfsFileEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as TinyCloudVfsFileEnvelope).version === 1 &&\n (value as TinyCloudVfsFileEnvelope).encoding === \"base64\" &&\n typeof (value as TinyCloudVfsFileEnvelope).data === \"string\"\n );\n}\n\nexport function encodeFileValue(content: Buffer): string | TinyCloudVfsFileEnvelope {\n const utf8 = content.toString(\"utf8\");\n if (Buffer.from(utf8, \"utf8\").equals(content)) {\n return utf8;\n }\n\n return encodeEnvelope(content);\n}\n\nexport function decodeEnvelope(value: unknown): Buffer {\n if (isEnvelopeShape(value)) {\n return Buffer.from((value as TinyCloudVfsFileEnvelope).data, \"base64\");\n }\n\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isEnvelopeShape(parsed)) {\n return Buffer.from(parsed.data, \"base64\");\n }\n } catch {\n // Plain text payloads are expected and should fall through.\n }\n\n return Buffer.from(value, \"utf8\");\n }\n\n throw new Error(\"unsupported file payload\");\n}\n\nfunction isMetadataShape(value: unknown): value is TinyCloudVfsMetadata {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (((value as TinyCloudVfsMetadata).kind === \"file\") || ((value as TinyCloudVfsMetadata).kind === \"directory\")) &&\n typeof (value as TinyCloudVfsMetadata).size === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mode === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).ctimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mtimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).birthtimeMs === \"number\"\n );\n}\n\nexport function decodeMetadata(value: unknown): TinyCloudVfsMetadata {\n if (isMetadataShape(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown;\n if (isMetadataShape(parsed)) {\n return parsed;\n }\n }\n\n throw new Error(\"unsupported metadata payload\");\n}\n\nexport function nowMetadata(kind: \"file\" | \"directory\", size: number, mode: number, existing?: TinyCloudVfsMetadata): TinyCloudVfsMetadata {\n const now = Date.now();\n return {\n kind,\n size,\n mode,\n ctimeMs: now,\n mtimeMs: now,\n birthtimeMs: existing?.birthtimeMs ?? now,\n };\n}\n\nexport function normalizeMode(kind: \"file\" | \"directory\", mode?: number): number {\n if (typeof mode === \"number\" && Number.isFinite(mode)) {\n return mode;\n }\n\n return kind === \"directory\" ? 0o755 : 0o644;\n}\n\nexport function stripStoragePrefix(fullKey: string, prefix: string): string {\n const normalizedPrefix = normalizeStoragePrefix(prefix);\n if (!normalizedPrefix) {\n return fullKey.replace(/^\\/+/, \"\");\n }\n\n const withSlash = `${normalizedPrefix}/`;\n if (fullKey === normalizedPrefix) {\n return \"\";\n }\n\n if (fullKey.startsWith(withSlash)) {\n return fullKey.slice(withSlash.length);\n }\n\n return fullKey;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/worker.ts","../src/errors.ts","../src/pathing.ts","../src/metadata.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport type { MessagePort } from \"node:worker_threads\";\nimport { TinyCloudNode } from \"@tinycloud/node-sdk\";\nimport { createEACCES, createEEXIST, createEIO, createEISDIR, createENOSPC, createENOTDIR, createENOTEMPTY, createENOENT, createEINVAL, createEBUSY } from \"./errors\";\nimport { dirnameOf, INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix, toLogicalPath } from \"./pathing\";\nimport { dataKey, decodeEnvelope, decodeMetadata, encodeFileValue, metadataKey, metadataPrefix, normalizeMode, nowMetadata, stripStoragePrefix } from \"./metadata\";\nimport type {\n TinyCloudVfsDirent,\n TinyCloudVfsMetadata,\n TinyCloudVfsSource,\n TinyCloudVfsWorkerInit,\n WorkerRequest,\n WorkerResponse,\n} from \"./types\";\n\ntype KvLike = {\n config?: { prefix?: string };\n get: (key: string, options?: Record<string, unknown>) => Promise<any>;\n put: (key: string, value: unknown, options?: Record<string, unknown>) => Promise<any>;\n list: (options?: Record<string, unknown>) => Promise<any>;\n delete: (key: string, options?: Record<string, unknown>) => Promise<any>;\n};\n\ninterface WorkerState {\n kv: KvLike | null;\n kvPrefix: string;\n storageRoot: string;\n}\n\nconst state: WorkerState = {\n kv: null,\n kvPrefix: \"\",\n storageRoot: \"\",\n};\n\nfunction toWorkerError(error: unknown): WorkerResponse {\n if (error && typeof error === \"object\" && \"code\" in error && \"message\" in error) {\n const typed = error as NodeJS.ErrnoException;\n return {\n ok: false,\n error: {\n code: typed.code ?? \"EIO\",\n message: typed.message,\n syscall: typed.syscall,\n path: typed.path,\n },\n };\n }\n\n return {\n ok: false,\n error: {\n code: \"EIO\",\n message: error instanceof Error ? error.message : String(error),\n syscall: \"vfs\",\n },\n };\n}\n\nfunction ensureKv(): KvLike {\n if (!state.kv) {\n throw createEIO(\"init\", \"/\", \"worker is not initialized\");\n }\n return state.kv;\n}\n\nfunction ensureMountedLogicalPath(inputPath: string): string {\n try {\n return toLogicalPath(inputPath);\n } catch {\n throw createENOENT(\"resolve\", inputPath);\n }\n}\n\nfunction effectiveStorageRoot(): string {\n return joinStoragePath(state.kvPrefix, state.storageRoot);\n}\n\nfunction effectiveStoragePath(logicalPath = \"\"): string {\n return joinStoragePath(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedDataKey(logicalPath: string): string {\n return dataKey(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedMetaKey(logicalPath: string): string {\n return metadataKey(effectiveStorageRoot(), logicalPath);\n}\n\nfunction scopedMetaPrefix(logicalPath = \"\"): string {\n return metadataPrefix(effectiveStorageRoot(), logicalPath);\n}\n\nfunction effectiveListPrefix(logicalPath = \"\", options?: { trailingSlash?: boolean }): string {\n const prefix = effectiveStoragePath(logicalPath);\n if (!options?.trailingSlash || !prefix) {\n return prefix;\n }\n return prefix.endsWith(\"/\") ? prefix : `${prefix}/`;\n}\n\nasync function kvGet(key: string): Promise<unknown> {\n const kv = ensureKv();\n const result = await kv.get(key);\n if (!result.ok) {\n if (result.error?.code === \"KV_NOT_FOUND\") {\n throw createENOENT(\"get\", key);\n }\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"get\", key, result.error.message);\n }\n throw createEIO(\"get\", key, result.error?.message ?? \"kv get failed\");\n }\n\n return result.data.data;\n}\n\nasync function kvPut(key: string, value: unknown): Promise<void> {\n const kv = ensureKv();\n const result = await kv.put(key, value);\n if (!result.ok) {\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"put\", key, result.error.message);\n }\n if (result.error?.code === \"STORAGE_QUOTA_EXCEEDED\" || result.error?.code === \"STORAGE_LIMIT_REACHED\") {\n throw createENOSPC(\"put\", key);\n }\n throw createEIO(\"put\", key, result.error?.message ?? \"kv put failed\");\n }\n}\n\nasync function kvDelete(key: string): Promise<void> {\n const kv = ensureKv();\n const result = await kv.delete(key);\n if (!result.ok) {\n if (result.error?.code === \"KV_NOT_FOUND\") {\n throw createENOENT(\"unlink\", key);\n }\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"unlink\", key, result.error.message);\n }\n throw createEIO(\"unlink\", key, result.error?.message ?? \"kv delete failed\");\n }\n}\n\nasync function kvList(prefix: string): Promise<string[]> {\n const kv = ensureKv();\n const listOptions = prefix\n ? { prefix, removePrefix: false }\n : { removePrefix: false };\n const result = await kv.list(listOptions);\n if (!result.ok) {\n if (result.error?.code === \"AUTH_UNAUTHORIZED\") {\n throw createEACCES(\"scandir\", prefix, result.error.message);\n }\n throw createEIO(\"scandir\", prefix, result.error?.message ?? \"kv list failed\");\n }\n return result.data.keys ?? [];\n}\n\nasync function tryMetadata(logicalPath: string): Promise<TinyCloudVfsMetadata | null> {\n try {\n return decodeMetadata(await kvGet(scopedMetaKey(logicalPath)));\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function tryRawFile(logicalPath: string): Promise<{ content: Buffer; metadata: TinyCloudVfsMetadata } | null> {\n try {\n const content = decodeEnvelope(await kvGet(scopedDataKey(logicalPath)));\n const metadata = nowMetadata(\n \"file\",\n content.length,\n normalizeMode(\"file\"),\n );\n return { content, metadata };\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function listDescendantKeys(logicalPath: string): Promise<{ dataKeys: string[]; metaKeys: string[] }> {\n const dataPrefixValue = effectiveListPrefix(logicalPath, { trailingSlash: true });\n const metaPrefixValue = effectiveListPrefix(\n joinStoragePath(\".tcvfs-meta\", logicalPath),\n { trailingSlash: true },\n );\n\n const [dataKeys, metaKeys] = await Promise.all([\n kvList(dataPrefixValue),\n kvList(metaPrefixValue),\n ]);\n\n return { dataKeys, metaKeys };\n}\n\nasync function tryInferredDirectory(logicalPath: string): Promise<TinyCloudVfsMetadata | null> {\n const { dataKeys, metaKeys } = await listDescendantKeys(logicalPath);\n if (dataKeys.length === 0 && metaKeys.length === 0) {\n return null;\n }\n\n return nowMetadata(\n \"directory\",\n 4096,\n normalizeMode(\"directory\"),\n );\n}\n\nasync function ensureDirectory(logicalPath: string): Promise<TinyCloudVfsMetadata> {\n if (!logicalPath) {\n return nowMetadata(\"directory\", 4096, normalizeMode(\"directory\"));\n }\n\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n if (metadata.kind !== \"directory\") {\n throw createENOTDIR(\"stat\", `/${logicalPath}`);\n }\n return metadata;\n }\n\n const inferred = await tryInferredDirectory(logicalPath);\n if (!inferred) {\n throw createENOENT(\"stat\", `/${logicalPath}`);\n }\n return inferred;\n}\n\nasync function readFileEntry(logicalPath: string): Promise<{ content: Buffer; metadata: TinyCloudVfsMetadata }> {\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"open\", `/${logicalPath}`);\n }\n\n const content = decodeEnvelope(await kvGet(scopedDataKey(logicalPath)));\n return { content, metadata };\n }\n\n const rawFile = await tryRawFile(logicalPath);\n if (rawFile) {\n return rawFile;\n }\n\n if (await tryInferredDirectory(logicalPath)) {\n throw createEISDIR(\"open\", `/${logicalPath}`);\n }\n\n throw createENOENT(\"open\", `/${logicalPath}`);\n}\n\nasync function statPath(logicalPath: string): Promise<TinyCloudVfsMetadata> {\n if (!logicalPath) {\n return nowMetadata(\"directory\", 4096, normalizeMode(\"directory\"));\n }\n\n const metadata = await tryMetadata(logicalPath);\n if (metadata) {\n return metadata;\n }\n\n const rawFile = await tryRawFile(logicalPath);\n if (rawFile) {\n return rawFile.metadata;\n }\n\n const inferredDirectory = await tryInferredDirectory(logicalPath);\n if (inferredDirectory) {\n return inferredDirectory;\n }\n\n throw createENOENT(\"stat\", `/${logicalPath}`);\n}\n\nasync function ensureParentDirectory(logicalPath: string): Promise<void> {\n const parent = dirnameOf(logicalPath);\n if (!parent) {\n return;\n }\n await ensureDirectory(parent);\n}\n\nasync function collectDirChildren(logicalPath: string): Promise<TinyCloudVfsDirent[]> {\n await ensureDirectory(logicalPath);\n\n const { dataKeys, metaKeys } = await listDescendantKeys(logicalPath);\n\n const names = new Set<string>();\n const relativePrefix = effectiveStoragePath(logicalPath);\n const relativeMetaPrefix = scopedMetaPrefix(logicalPath);\n\n for (const fullKey of dataKeys) {\n const relative = stripStoragePrefix(fullKey, relativePrefix);\n const first = relative.split(\"/\").filter(Boolean)[0];\n if (first) {\n names.add(first);\n }\n }\n\n for (const fullKey of metaKeys) {\n const relative = stripStoragePrefix(fullKey, relativeMetaPrefix);\n const first = relative.split(\"/\").filter(Boolean)[0];\n if (first) {\n names.add(first);\n }\n }\n\n const entries = await Promise.all(\n [...names]\n .filter((name) => name !== INTERNAL_META_PREFIX)\n .sort()\n .map(async (name): Promise<TinyCloudVfsDirent> => {\n const childPath = joinStoragePath(logicalPath, name);\n const metadata = await statPath(childPath);\n return {\n name,\n kind: metadata.kind,\n parentPath: logicalPath ? `/${logicalPath}` : \"/\",\n };\n }),\n );\n\n return entries;\n}\n\nasync function writeFileEntry(logicalPath: string, content: Uint8Array, mode?: number): Promise<TinyCloudVfsMetadata> {\n await ensureParentDirectory(logicalPath);\n const existing = await tryMetadata(logicalPath);\n if (existing) {\n if (existing.kind !== \"file\") {\n throw createEISDIR(\"writeFile\", `/${logicalPath}`);\n }\n } else if (await tryInferredDirectory(logicalPath)) {\n throw createEISDIR(\"writeFile\", `/${logicalPath}`);\n }\n\n const buffer = Buffer.from(content);\n const metadata = nowMetadata(\n \"file\",\n buffer.length,\n normalizeMode(\"file\", mode ?? existing?.mode),\n existing ?? undefined,\n );\n\n await kvPut(scopedDataKey(logicalPath), encodeFileValue(buffer));\n await kvPut(scopedMetaKey(logicalPath), metadata);\n return metadata;\n}\n\nasync function mkdirEntry(logicalPath: string, recursive = false, mode?: number): Promise<void> {\n if (!logicalPath) {\n return;\n }\n\n const existing = await tryMetadata(logicalPath);\n if (existing) {\n if (existing.kind === \"directory\") {\n return;\n }\n throw createEEXIST(\"mkdir\", `/${logicalPath}`);\n }\n\n if (await tryRawFile(logicalPath)) {\n throw createEEXIST(\"mkdir\", `/${logicalPath}`);\n }\n\n if (await tryInferredDirectory(logicalPath)) {\n return;\n }\n\n const segments = logicalPath.split(\"/\").filter(Boolean);\n const targets = recursive\n ? segments.map((_, index) => segments.slice(0, index + 1).join(\"/\"))\n : [logicalPath];\n\n for (const target of targets) {\n const current = await tryMetadata(target);\n if (current) {\n if (current.kind !== \"directory\") {\n throw createENOTDIR(\"mkdir\", `/${target}`);\n }\n continue;\n }\n\n await ensureParentDirectory(target);\n const metadata = nowMetadata(\"directory\", 4096, normalizeMode(\"directory\", mode));\n await kvPut(scopedMetaKey(target), metadata);\n }\n}\n\nasync function rmdirEntry(logicalPath: string): Promise<void> {\n if (!logicalPath) {\n throw createEBUSY(\"rmdir\", \"/\");\n }\n\n const metadata = await ensureDirectory(logicalPath);\n const children = await collectDirChildren(logicalPath);\n if (children.length > 0) {\n throw createENOTEMPTY(\"rmdir\", `/${logicalPath}`);\n }\n\n await kvDelete(scopedMetaKey(logicalPath));\n}\n\nasync function unlinkEntry(logicalPath: string): Promise<void> {\n const metadata = await statPath(logicalPath);\n if (metadata.kind !== \"file\") {\n throw createEISDIR(\"unlink\", `/${logicalPath}`);\n }\n\n await kvDelete(scopedDataKey(logicalPath));\n try {\n await kvDelete(scopedMetaKey(logicalPath));\n } catch (error) {\n const typed = error as NodeJS.ErrnoException;\n if (typed.code !== \"ENOENT\") {\n throw error;\n }\n }\n}\n\nasync function renameEntry(oldLogicalPath: string, newLogicalPath: string): Promise<void> {\n const source = await statPath(oldLogicalPath);\n if (source.kind !== \"file\") {\n throw createEINVAL(\"rename\", `/${oldLogicalPath}`, \"directory rename is not supported in v1\");\n }\n\n const content = decodeEnvelope(await kvGet(scopedDataKey(oldLogicalPath)));\n await writeFileEntry(newLogicalPath, content, source.mode);\n await unlinkEntry(oldLogicalPath);\n}\n\nasync function initialize(init: TinyCloudVfsWorkerInit): Promise<void> {\n const node = new TinyCloudNode({ host: init.source.host });\n await node.restoreSession(init.source.session);\n\n const kv = node.kv as unknown as KvLike;\n const servicePrefix = init.source.kind === \"resolved-delegation\"\n ? normalizeStoragePrefix(init.source.kvPrefix)\n : normalizeStoragePrefix(kv.config?.prefix);\n const mountPrefix = normalizeStoragePrefix(init.mountPrefix);\n\n state.kv = kv;\n state.kvPrefix = servicePrefix;\n state.storageRoot = mountPrefix;\n}\n\nasync function handleRequest(request: WorkerRequest): Promise<WorkerResponse> {\n switch (request.type) {\n case \"init\":\n await initialize(request.init);\n return { ok: true, result: null };\n case \"stat\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const metadata = await statPath(logicalPath);\n return { ok: true, result: { metadata } };\n }\n case \"readFile\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const { content, metadata } = await readFileEntry(logicalPath);\n return { ok: true, result: { content, metadata } };\n }\n case \"writeFile\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await writeFileEntry(logicalPath, request.content, request.mode);\n return { ok: true, result: null };\n }\n case \"readdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n const entries = await collectDirChildren(logicalPath);\n return { ok: true, result: { entries } };\n }\n case \"mkdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await mkdirEntry(logicalPath, request.recursive, request.mode);\n return { ok: true, result: null };\n }\n case \"rmdir\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await rmdirEntry(logicalPath);\n return { ok: true, result: null };\n }\n case \"unlink\": {\n const logicalPath = ensureMountedLogicalPath(request.path);\n await unlinkEntry(logicalPath);\n return { ok: true, result: null };\n }\n case \"rename\": {\n const oldLogicalPath = ensureMountedLogicalPath(request.oldPath);\n const newLogicalPath = ensureMountedLogicalPath(request.newPath);\n await renameEntry(oldLogicalPath, newLogicalPath);\n return { ok: true, result: null };\n }\n default:\n throw createEINVAL(\"vfs\", \"/\");\n }\n}\n\nparentPort?.on(\"message\", async (message: { request: WorkerRequest; replyPort: MessagePort; waitBuffer: SharedArrayBuffer }) => {\n const view = new Int32Array(message.waitBuffer);\n\n try {\n const response = await handleRequest(message.request);\n message.replyPort.postMessage(response);\n } catch (error) {\n message.replyPort.postMessage(toWorkerError(error));\n } finally {\n Atomics.store(view, 0, 1);\n Atomics.notify(view, 0, 1);\n message.replyPort.close();\n }\n});\n","const ERRNO: Record<string, number> = {\n EPERM: -1,\n ENOENT: -2,\n EIO: -5,\n EBADF: -9,\n EACCES: -13,\n EBUSY: -16,\n EEXIST: -17,\n ENOTDIR: -20,\n EISDIR: -21,\n EINVAL: -22,\n ENOTEMPTY: -39,\n ENOSPC: -28,\n EROFS: -30,\n};\n\nexport function createNodeError(\n code: string,\n message: string,\n syscall: string,\n path?: string,\n): NodeJS.ErrnoException {\n const error = new Error(message) as NodeJS.ErrnoException;\n error.code = code;\n error.errno = ERRNO[code] ?? -1;\n error.syscall = syscall;\n if (path) {\n error.path = path;\n }\n return error;\n}\n\nexport function createENOENT(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOENT\", `no such file or directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEISDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EISDIR\", `illegal operation on a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTDIR(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTDIR\", `not a directory, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createENOTEMPTY(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOTEMPTY\", `directory not empty, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEEXIST(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EEXIST\", `file already exists, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEACCES(syscall: string, path: string, message = \"permission denied\"): NodeJS.ErrnoException {\n return createNodeError(\"EACCES\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEROFS(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"EROFS\", `read-only file system, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEIO(syscall: string, path: string, message: string): NodeJS.ErrnoException {\n return createNodeError(\"EIO\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\n/** The owner's TinyCloud storage is full (or too small for this write); nothing was written. */\nexport function createENOSPC(syscall: string, path: string): NodeJS.ErrnoException {\n return createNodeError(\"ENOSPC\", `TinyCloud storage is full; nothing was written, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEBUSY(syscall: string, path: string, message = \"resource busy or locked\"): NodeJS.ErrnoException {\n return createNodeError(\"EBUSY\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function createEINVAL(syscall: string, path: string, message = \"invalid argument\"): NodeJS.ErrnoException {\n return createNodeError(\"EINVAL\", `${message}, ${syscall} '${path}'`, syscall, path);\n}\n\nexport function fromWorkerError(error: { code: string; message: string; syscall?: string; path?: string }): NodeJS.ErrnoException {\n return createNodeError(\n error.code,\n error.message,\n error.syscall ?? \"vfs\",\n error.path,\n );\n}\n","import { posix as pathPosix } from \"node:path\";\n\nexport const INTERNAL_META_PREFIX = \".tcvfs-meta\";\n\nexport function normalizeVfsPath(inputPath: string): string {\n const normalized = pathPosix.normalize(inputPath.replace(/\\\\/g, \"/\"));\n const absolute = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n return absolute;\n}\n\nexport function toLogicalPath(inputPath: string): string {\n const normalized = normalizeVfsPath(inputPath);\n\n if (normalized.includes(\"\\0\")) {\n throw new Error(\"invalid path\");\n }\n\n if (normalized === \"/\") {\n return \"\";\n }\n\n const logical = normalized.slice(1);\n if (\n logical === INTERNAL_META_PREFIX ||\n logical.startsWith(`${INTERNAL_META_PREFIX}/`) ||\n logical.split(\"/\").includes(\"..\")\n ) {\n throw new Error(\"path escapes virtual root\");\n }\n\n return logical;\n}\n\nexport function normalizeStoragePrefix(prefix?: string): string {\n if (!prefix) {\n return \"\";\n }\n\n return prefix\n .replace(/\\\\/g, \"/\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n}\n\nexport function joinStoragePath(...parts: Array<string | undefined>): string {\n const cleaned = parts\n .filter((part): part is string => Boolean(part))\n .map((part) => normalizeStoragePrefix(part));\n\n return cleaned.filter(Boolean).join(\"/\");\n}\n\nexport function dirnameOf(logicalPath: string): string {\n if (!logicalPath) {\n return \"\";\n }\n\n const dir = pathPosix.dirname(`/${logicalPath}`);\n return dir === \"/\" ? \"\" : dir.slice(1);\n}\n\nexport function basenameOf(logicalPath: string): string {\n return pathPosix.basename(logicalPath ? `/${logicalPath}` : \"/\");\n}\n","import { INTERNAL_META_PREFIX, joinStoragePath, normalizeStoragePrefix } from \"./pathing\";\nimport type { TinyCloudVfsFileEnvelope, TinyCloudVfsMetadata } from \"./types\";\n\nexport function dataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, logicalPath);\n}\n\nexport function metadataKey(storageRoot: string, logicalPath: string): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function metadataPrefix(storageRoot: string, logicalPath = \"\"): string {\n return joinStoragePath(storageRoot, INTERNAL_META_PREFIX, logicalPath);\n}\n\nexport function encodeEnvelope(content: Buffer): TinyCloudVfsFileEnvelope {\n return {\n version: 1,\n encoding: \"base64\",\n data: content.toString(\"base64\"),\n };\n}\n\nfunction isEnvelopeShape(value: unknown): value is TinyCloudVfsFileEnvelope {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (value as TinyCloudVfsFileEnvelope).version === 1 &&\n (value as TinyCloudVfsFileEnvelope).encoding === \"base64\" &&\n typeof (value as TinyCloudVfsFileEnvelope).data === \"string\"\n );\n}\n\nexport function encodeFileValue(content: Buffer): string | TinyCloudVfsFileEnvelope {\n const utf8 = content.toString(\"utf8\");\n if (Buffer.from(utf8, \"utf8\").equals(content)) {\n return utf8;\n }\n\n return encodeEnvelope(content);\n}\n\nexport function decodeEnvelope(value: unknown): Buffer {\n if (isEnvelopeShape(value)) {\n return Buffer.from((value as TinyCloudVfsFileEnvelope).data, \"base64\");\n }\n\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (isEnvelopeShape(parsed)) {\n return Buffer.from(parsed.data, \"base64\");\n }\n } catch {\n // Plain text payloads are expected and should fall through.\n }\n\n return Buffer.from(value, \"utf8\");\n }\n\n throw new Error(\"unsupported file payload\");\n}\n\nfunction isMetadataShape(value: unknown): value is TinyCloudVfsMetadata {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n (((value as TinyCloudVfsMetadata).kind === \"file\") || ((value as TinyCloudVfsMetadata).kind === \"directory\")) &&\n typeof (value as TinyCloudVfsMetadata).size === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mode === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).ctimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).mtimeMs === \"number\" &&\n typeof (value as TinyCloudVfsMetadata).birthtimeMs === \"number\"\n );\n}\n\nexport function decodeMetadata(value: unknown): TinyCloudVfsMetadata {\n if (isMetadataShape(value)) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = JSON.parse(value) as unknown;\n if (isMetadataShape(parsed)) {\n return parsed;\n }\n }\n\n throw new Error(\"unsupported metadata payload\");\n}\n\nexport function nowMetadata(kind: \"file\" | \"directory\", size: number, mode: number, existing?: TinyCloudVfsMetadata): TinyCloudVfsMetadata {\n const now = Date.now();\n return {\n kind,\n size,\n mode,\n ctimeMs: now,\n mtimeMs: now,\n birthtimeMs: existing?.birthtimeMs ?? now,\n };\n}\n\nexport function normalizeMode(kind: \"file\" | \"directory\", mode?: number): number {\n if (typeof mode === \"number\" && Number.isFinite(mode)) {\n return mode;\n }\n\n return kind === \"directory\" ? 0o755 : 0o644;\n}\n\nexport function stripStoragePrefix(fullKey: string, prefix: string): string {\n const normalizedPrefix = normalizeStoragePrefix(prefix);\n if (!normalizedPrefix) {\n return fullKey.replace(/^\\/+/, \"\");\n }\n\n const withSlash = `${normalizedPrefix}/`;\n if (fullKey === normalizedPrefix) {\n return \"\";\n }\n\n if (fullKey.startsWith(withSlash)) {\n return fullKey.slice(withSlash.length);\n }\n\n return fullKey;\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tinycloud/vfs",
3
- "version": "0.1.15-beta.7",
3
+ "version": "0.2.0-beta.9",
4
4
  "description": "TinyCloud Virtual File System for Node.js",
5
5
  "author": "TinyCloud, Inc.",
6
6
  "license": "EGPL",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@platformatic/vfs": "^0.4.0",
30
- "@tinycloud/node-sdk": "3.1.0-beta.7"
30
+ "@tinycloud/node-sdk": "3.1.0-beta.8"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^20",