@tinycloud/vfs 0.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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"]}
@@ -0,0 +1,394 @@
1
+ import { Buffer as Buffer$1 } from 'node:buffer';
2
+ import { VirtualProvider, VirtualFileSystem } from '@platformatic/vfs';
3
+
4
+ interface PortableDelegationLike {
5
+ cid: string;
6
+ delegationHeader: {
7
+ Authorization: string;
8
+ };
9
+ spaceId: string;
10
+ path: string;
11
+ actions: string[];
12
+ expiry: Date;
13
+ delegateDID: string;
14
+ ownerAddress: string;
15
+ chainId: number;
16
+ host?: string;
17
+ disableSubDelegation?: boolean;
18
+ publicDelegation?: PortableDelegationLike;
19
+ }
20
+ interface TinyCloudVfsSessionData {
21
+ delegationHeader: {
22
+ Authorization: string;
23
+ };
24
+ delegationCid: string;
25
+ spaceId: string;
26
+ jwk: object;
27
+ verificationMethod: string;
28
+ address?: string;
29
+ chainId?: number;
30
+ }
31
+ type TinyCloudVfsSource = {
32
+ kind: "session";
33
+ host: string;
34
+ session: TinyCloudVfsSessionData;
35
+ } | {
36
+ kind: "resolved-delegation";
37
+ host: string;
38
+ session: TinyCloudVfsSessionData;
39
+ kvPrefix: string;
40
+ };
41
+ interface TinyCloudVfsOptions {
42
+ mountPoint?: string;
43
+ mountPrefix?: string;
44
+ readOnly?: boolean;
45
+ moduleHooks?: boolean;
46
+ overlay?: boolean;
47
+ virtualCwd?: boolean;
48
+ }
49
+ interface TinyCloudVfsProviderOptions {
50
+ source: TinyCloudVfsSource;
51
+ mountPrefix?: string;
52
+ readOnly?: boolean;
53
+ }
54
+ interface TinyCloudVfsWorkerInit {
55
+ source: TinyCloudVfsSource;
56
+ mountPrefix: string;
57
+ }
58
+ interface TinyCloudVfsMetadata {
59
+ kind: "file" | "directory";
60
+ size: number;
61
+ mode: number;
62
+ ctimeMs: number;
63
+ mtimeMs: number;
64
+ birthtimeMs: number;
65
+ }
66
+ interface TinyCloudVfsDirent {
67
+ name: string;
68
+ kind: "file" | "directory";
69
+ parentPath: string;
70
+ }
71
+ type WorkerRequest = {
72
+ type: "init";
73
+ init: TinyCloudVfsWorkerInit;
74
+ } | {
75
+ type: "stat";
76
+ path: string;
77
+ } | {
78
+ type: "readFile";
79
+ path: string;
80
+ } | {
81
+ type: "writeFile";
82
+ path: string;
83
+ content: Uint8Array;
84
+ mode?: number;
85
+ } | {
86
+ type: "readdir";
87
+ path: string;
88
+ } | {
89
+ type: "mkdir";
90
+ path: string;
91
+ recursive?: boolean;
92
+ mode?: number;
93
+ } | {
94
+ type: "rmdir";
95
+ path: string;
96
+ } | {
97
+ type: "unlink";
98
+ path: string;
99
+ } | {
100
+ type: "rename";
101
+ oldPath: string;
102
+ newPath: string;
103
+ };
104
+ type WorkerResponse = {
105
+ ok: true;
106
+ result: null;
107
+ } | {
108
+ ok: true;
109
+ result: {
110
+ metadata: TinyCloudVfsMetadata;
111
+ };
112
+ } | {
113
+ ok: true;
114
+ result: {
115
+ content: Uint8Array;
116
+ metadata: TinyCloudVfsMetadata;
117
+ };
118
+ } | {
119
+ ok: true;
120
+ result: {
121
+ entries: TinyCloudVfsDirent[];
122
+ };
123
+ } | {
124
+ ok: false;
125
+ error: WorkerErrorPayload;
126
+ };
127
+ interface WorkerErrorPayload {
128
+ code: string;
129
+ message: string;
130
+ syscall?: string;
131
+ path?: string;
132
+ }
133
+ interface TinyCloudVfsHandleState {
134
+ path: string;
135
+ flags: string;
136
+ mode: number;
137
+ content: Buffer;
138
+ metadata: TinyCloudVfsMetadata;
139
+ }
140
+ interface CreateTinyCloudDelegatedVfsOptions extends Omit<TinyCloudVfsOptions, "mountPrefix"> {
141
+ node: TinyCloudNodeLike;
142
+ delegation: PortableDelegationLike;
143
+ mountPrefix?: string;
144
+ host?: string;
145
+ }
146
+ interface CreateTinyCloudNodeVfsOptions extends Omit<TinyCloudVfsOptions, "mountPrefix"> {
147
+ mountPrefix?: string;
148
+ host?: string;
149
+ }
150
+ interface TinyCloudNodeLike {
151
+ session?: TinyCloudVfsSessionData;
152
+ config?: {
153
+ host?: string;
154
+ };
155
+ useDelegation?: (delegation: PortableDelegationLike) => Promise<{
156
+ session?: TinyCloudVfsSessionData;
157
+ kv: {
158
+ config?: {
159
+ prefix?: string;
160
+ };
161
+ };
162
+ }>;
163
+ }
164
+
165
+ declare class TinyCloudVfsBridge {
166
+ private readonly worker;
167
+ constructor(init: TinyCloudVfsWorkerInit);
168
+ close(): void;
169
+ requestSync(request: WorkerRequest): WorkerResponse;
170
+ requestAsync(request: WorkerRequest): Promise<WorkerResponse>;
171
+ }
172
+
173
+ declare class TinyCloudVfsFileHandle {
174
+ private readonly bridge;
175
+ private readonly state;
176
+ private closed;
177
+ private dirty;
178
+ private position;
179
+ constructor(bridge: TinyCloudVfsBridge, state: TinyCloudVfsHandleState);
180
+ private ensureOpen;
181
+ private commit;
182
+ readSync(buffer: Buffer$1, offset: number, length: number, position: number | null): number;
183
+ writeSync(buffer: Buffer$1, offset: number, length: number, position: number | null): number;
184
+ readFileSync(options?: BufferEncoding | {
185
+ encoding?: BufferEncoding | null;
186
+ } | null): Buffer$1 | string;
187
+ writeFileSync(data: string | Buffer$1, options?: BufferEncoding | {
188
+ encoding?: BufferEncoding;
189
+ mode?: number;
190
+ }): void;
191
+ statSync(): {
192
+ dev: number;
193
+ mode: number;
194
+ nlink: number;
195
+ uid: number;
196
+ gid: number;
197
+ rdev: number;
198
+ blksize: number;
199
+ ino: number;
200
+ size: number;
201
+ blocks: number;
202
+ atimeMs: number;
203
+ mtimeMs: number;
204
+ ctimeMs: number;
205
+ birthtimeMs: number;
206
+ atime: Date;
207
+ mtime: Date;
208
+ ctime: Date;
209
+ birthtime: Date;
210
+ isFile: () => boolean;
211
+ isDirectory: () => boolean;
212
+ isSymbolicLink: () => boolean;
213
+ isBlockDevice: () => boolean;
214
+ isCharacterDevice: () => boolean;
215
+ isFIFO: () => boolean;
216
+ isSocket: () => boolean;
217
+ };
218
+ closeSync(): void;
219
+ }
220
+ declare class TinyCloudVfsProvider extends VirtualProvider {
221
+ private readonly bridge;
222
+ private readonly forceReadOnly;
223
+ constructor(options: TinyCloudVfsProviderOptions);
224
+ get readonly(): boolean;
225
+ close(): void;
226
+ private ensureWritable;
227
+ private normalize;
228
+ openSync(path: string, flags?: string, mode?: number): TinyCloudVfsFileHandle;
229
+ open(path: string, flags?: string, mode?: number): Promise<TinyCloudVfsFileHandle>;
230
+ statSync(path: string): {
231
+ dev: number;
232
+ mode: number;
233
+ nlink: number;
234
+ uid: number;
235
+ gid: number;
236
+ rdev: number;
237
+ blksize: number;
238
+ ino: number;
239
+ size: number;
240
+ blocks: number;
241
+ atimeMs: number;
242
+ mtimeMs: number;
243
+ ctimeMs: number;
244
+ birthtimeMs: number;
245
+ atime: Date;
246
+ mtime: Date;
247
+ ctime: Date;
248
+ birthtime: Date;
249
+ isFile: () => boolean;
250
+ isDirectory: () => boolean;
251
+ isSymbolicLink: () => boolean;
252
+ isBlockDevice: () => boolean;
253
+ isCharacterDevice: () => boolean;
254
+ isFIFO: () => boolean;
255
+ isSocket: () => boolean;
256
+ };
257
+ stat(path: string): Promise<{
258
+ dev: number;
259
+ mode: number;
260
+ nlink: number;
261
+ uid: number;
262
+ gid: number;
263
+ rdev: number;
264
+ blksize: number;
265
+ ino: number;
266
+ size: number;
267
+ blocks: number;
268
+ atimeMs: number;
269
+ mtimeMs: number;
270
+ ctimeMs: number;
271
+ birthtimeMs: number;
272
+ atime: Date;
273
+ mtime: Date;
274
+ ctime: Date;
275
+ birthtime: Date;
276
+ isFile: () => boolean;
277
+ isDirectory: () => boolean;
278
+ isSymbolicLink: () => boolean;
279
+ isBlockDevice: () => boolean;
280
+ isCharacterDevice: () => boolean;
281
+ isFIFO: () => boolean;
282
+ isSocket: () => boolean;
283
+ }>;
284
+ lstatSync(path: string): {
285
+ dev: number;
286
+ mode: number;
287
+ nlink: number;
288
+ uid: number;
289
+ gid: number;
290
+ rdev: number;
291
+ blksize: number;
292
+ ino: number;
293
+ size: number;
294
+ blocks: number;
295
+ atimeMs: number;
296
+ mtimeMs: number;
297
+ ctimeMs: number;
298
+ birthtimeMs: number;
299
+ atime: Date;
300
+ mtime: Date;
301
+ ctime: Date;
302
+ birthtime: Date;
303
+ isFile: () => boolean;
304
+ isDirectory: () => boolean;
305
+ isSymbolicLink: () => boolean;
306
+ isBlockDevice: () => boolean;
307
+ isCharacterDevice: () => boolean;
308
+ isFIFO: () => boolean;
309
+ isSocket: () => boolean;
310
+ };
311
+ lstat(path: string): Promise<{
312
+ dev: number;
313
+ mode: number;
314
+ nlink: number;
315
+ uid: number;
316
+ gid: number;
317
+ rdev: number;
318
+ blksize: number;
319
+ ino: number;
320
+ size: number;
321
+ blocks: number;
322
+ atimeMs: number;
323
+ mtimeMs: number;
324
+ ctimeMs: number;
325
+ birthtimeMs: number;
326
+ atime: Date;
327
+ mtime: Date;
328
+ ctime: Date;
329
+ birthtime: Date;
330
+ isFile: () => boolean;
331
+ isDirectory: () => boolean;
332
+ isSymbolicLink: () => boolean;
333
+ isBlockDevice: () => boolean;
334
+ isCharacterDevice: () => boolean;
335
+ isFIFO: () => boolean;
336
+ isSocket: () => boolean;
337
+ }>;
338
+ readdirSync(path: string, options?: {
339
+ withFileTypes?: boolean;
340
+ }): string[] | {
341
+ name: string;
342
+ parentPath: string;
343
+ path: string;
344
+ isFile: () => boolean;
345
+ isDirectory: () => boolean;
346
+ isSymbolicLink: () => boolean;
347
+ isBlockDevice: () => boolean;
348
+ isCharacterDevice: () => boolean;
349
+ isFIFO: () => boolean;
350
+ isSocket: () => boolean;
351
+ }[];
352
+ readdir(path: string, options?: {
353
+ withFileTypes?: boolean;
354
+ }): Promise<string[] | {
355
+ name: string;
356
+ parentPath: string;
357
+ path: string;
358
+ isFile: () => boolean;
359
+ isDirectory: () => boolean;
360
+ isSymbolicLink: () => boolean;
361
+ isBlockDevice: () => boolean;
362
+ isCharacterDevice: () => boolean;
363
+ isFIFO: () => boolean;
364
+ isSocket: () => boolean;
365
+ }[]>;
366
+ mkdirSync(path: string, options?: {
367
+ recursive?: boolean;
368
+ mode?: number;
369
+ }): string | undefined;
370
+ mkdir(path: string, options?: {
371
+ recursive?: boolean;
372
+ mode?: number;
373
+ }): Promise<string | undefined>;
374
+ rmdirSync(path: string): void;
375
+ rmdir(path: string): Promise<void>;
376
+ unlinkSync(path: string): void;
377
+ unlink(path: string): Promise<void>;
378
+ renameSync(oldPath: string, newPath: string): void;
379
+ rename(oldPath: string, newPath: string): Promise<void>;
380
+ }
381
+ declare function createTinyCloudVfs(options: TinyCloudVfsProviderOptions & TinyCloudVfsOptions): {
382
+ provider: TinyCloudVfsProvider;
383
+ vfs: VirtualFileSystem;
384
+ };
385
+ declare function createTinyCloudVfsFromNode(node: TinyCloudNodeLike, options?: CreateTinyCloudNodeVfsOptions): {
386
+ provider: TinyCloudVfsProvider;
387
+ vfs: VirtualFileSystem;
388
+ };
389
+ declare function createTinyCloudDelegatedVfs(options: CreateTinyCloudDelegatedVfsOptions): Promise<{
390
+ provider: TinyCloudVfsProvider;
391
+ vfs: VirtualFileSystem;
392
+ }>;
393
+
394
+ export { type CreateTinyCloudDelegatedVfsOptions, type CreateTinyCloudNodeVfsOptions, type TinyCloudVfsMetadata, type TinyCloudVfsOptions, TinyCloudVfsProvider, type TinyCloudVfsProviderOptions, type TinyCloudVfsSessionData, type TinyCloudVfsSource, createTinyCloudDelegatedVfs, createTinyCloudVfs, createTinyCloudVfsFromNode };