@zenfs/core
Version:
A filesystem, anywhere
159 lines (158 loc) • 5.23 kB
TypeScript
import type { FileReadResult } from 'node:fs/promises';
import { InMemoryStore } from './backends/memory.js';
import { StoreFS } from './backends/store/fs.js';
import { File } from './file.js';
import type { StatsLike } from './stats.js';
import { Stats } from './stats.js';
import type { Ino } from './inode.js';
/**
* A device
* @todo Maybe add major/minor number or some other device information, like a UUID?
* @experimental
*/
export interface Device {
/**
* The device's driver
*/
driver: DeviceDriver;
/**
* Which inode the device is assigned
*/
ino: Ino;
}
/**
* A device driver
* @experimental
*/
export interface DeviceDriver {
/**
* The name of the device driver
*/
name: string;
/**
* Whether the device is buffered (a "block" device) or unbuffered (a "character" device)
*/
isBuffered: boolean;
/**
* Synchronously read from the device
*/
read(file: DeviceFile, buffer: ArrayBufferView, offset?: number, length?: number, position?: number): number;
/**
* Synchronously write to the device
*/
write(file: DeviceFile, buffer: Uint8Array, offset: number, length: number, position?: number): number;
/**
* Sync the device
*/
sync?(file: DeviceFile): void;
/**
* Close the device
*/
close?(file: DeviceFile): void;
}
/**
* The base class for device files
* This class only does some simple things:
* It implements `truncate` using `write` and it has non-device methods throw.
* It is up to device drivers to implement the rest of the functionality.
* @experimental
*/
export declare class DeviceFile extends File {
fs: DeviceFS;
readonly device: Device;
position: number;
constructor(fs: DeviceFS, path: string, device: Device);
get driver(): DeviceDriver;
protected get stats(): Partial<StatsLike>;
stat(): Promise<Stats>;
statSync(): Stats;
readSync(buffer: ArrayBufferView, offset?: number, length?: number, position?: number): number;
read<TBuffer extends NodeJS.ArrayBufferView>(buffer: TBuffer, offset?: number, length?: number): Promise<FileReadResult<TBuffer>>;
writeSync(buffer: Uint8Array, offset?: number, length?: number, position?: number): number;
write(buffer: Uint8Array, offset?: number, length?: number, position?: number): Promise<number>;
truncate(length: number): Promise<void>;
truncateSync(length: number): void;
closeSync(): void;
close(): Promise<void>;
syncSync(): void;
sync(): Promise<void>;
chown(): Promise<void>;
chownSync(): void;
chmod(): Promise<void>;
chmodSync(): void;
utimes(): Promise<void>;
utimesSync(): void;
_setType(): Promise<void>;
_setTypeSync(): void;
}
/**
* @experimental
*/
export declare class DeviceFS extends StoreFS<InMemoryStore> {
protected readonly devices: Map<string, Device>;
createDevice(path: string, driver: DeviceDriver): Device;
constructor();
rename(oldPath: string, newPath: string): Promise<void>;
renameSync(oldPath: string, newPath: string): void;
stat(path: string): Promise<Stats>;
statSync(path: string): Stats;
openFile(path: string, flag: string): Promise<File>;
openFileSync(path: string, flag: string): File;
createFile(path: string, flag: string, mode: number): Promise<File>;
createFileSync(path: string, flag: string, mode: number): File;
unlink(path: string): Promise<void>;
unlinkSync(path: string): void;
rmdir(path: string): Promise<void>;
rmdirSync(path: string): void;
mkdir(path: string, mode: number): Promise<void>;
mkdirSync(path: string, mode: number): void;
readdir(path: string): Promise<string[]>;
readdirSync(path: string): string[];
link(target: string, link: string): Promise<void>;
linkSync(target: string, link: string): void;
sync(path: string, data: Uint8Array, stats: Readonly<Stats>): Promise<void>;
syncSync(path: string, data: Uint8Array, stats: Readonly<Stats>): void;
}
/**
* Simulates the `/dev/null` device.
* - Reads return 0 bytes (EOF).
* - Writes discard data, advancing the file position.
* @experimental
*/
export declare const nullDevice: DeviceDriver;
/**
* Simulates the `/dev/zero` device
* Provides an infinite stream of zeroes when read.
* Discards any data written to it.
*
* - Reads fill the buffer with zeroes.
* - Writes discard data but update the file position.
* - Provides basic file metadata, treating it as a character device.
* @experimental
*/
export declare const zeroDevice: DeviceDriver;
/**
* Simulates the `/dev/full` device.
* - Reads behave like `/dev/zero` (returns zeroes).
* - Writes always fail with ENOSPC (no space left on device).
* @experimental
*/
export declare const fullDevice: DeviceDriver;
/**
* Simulates the `/dev/random` device.
* - Reads return random bytes.
* - Writes discard data, advancing the file position.
* @experimental
*/
export declare const randomDevice: DeviceDriver;
/**
* Shortcuts for importing.
* @experimental
*/
declare const _default: {
null: DeviceDriver;
zero: DeviceDriver;
full: DeviceDriver;
random: DeviceDriver;
};
export default _default;