als-path-tree
Version:
A Node.js library for managing a virtual file system structure, offering functionalities for file and directory operations with a shared storage system.
220 lines (180 loc) • 7.25 kB
Markdown
# als-path-tree v3
> **Important:** Version 3.0 of `als-path-tree` is **not** backward compatible with the older v2.0.
> The entire structure has been redesigned to provide a more flexible, event-driven path tree and caching system.
## Overview
The `als-path-tree` library provides a robust caching system for file-like structures. It supports hierarchical directories and files, integrating an event emitter and a memory monitoring mechanism to optimize resource usage. The library is ideal for managing in-memory representations of file systems, including local disks, cloud-based systems like S3, or any other custom backend.
## Key Features
- Flexible directory and file structures.
- Event-driven operations using `als-event-emitter`.
- Memory management with automatic cleanup.
- Configurable through global options for various use cases.
## Installation
```bash
npm install als-path-tree
```
## Import
```js
const { Item, File, Directory, MemoryMonitor, options } = require('als-path-tree');
```
## Architecture
1. **`Item` Class:** The base class for all entities (`File` and `Directory`).
2. **`Directory` Class:** Represents directories and manages nested structures.
3. **`File` Class:** Represents files, including content and metadata.
4. **`MemoryMonitor` Class:** Handles memory management for files.
5. **Global `options`:** Configure thresholds, weights, and logging.
---
## Classes and APIs
### `Item` Class
A foundational class for file and directory entities. Provides utilities for path management and event-driven behavior.
#### API
```js
class Item {
static get options(); // Returns the global options object.
static memMonitor; // Shared MemoryMonitor instance.
static emitter; // EventEmitter instance.
get main(); // Returns the Item class itself (useful in extended classes).
constructor(name, parent, isFile = false); // Initializes the entity.
get path(); // Full path of the item.
get root(); // Returns the root directory.
getParts(path); // Splits a path into segments.
splitPath(path); // Splits a path into parts and filename.
rename(newName); // Renames the item.
}
```
### `Directory` Class
Extends `Item` and represents a directory.
#### API
```js
class Directory extends Item {
constructor(name, parent = null);
get isEmpty(); // Returns true if the directory is empty.
get dirs(); // Returns all nested directories as an array.
get list(); // Returns all nested files and directories.
getItem(path); // Retrieves an item by path.
addDir(path); // Adds a new directory.
addFile(path, meta, content); // Adds a new file.
removeIfEmpty(); // Removes the directory if it's empty.
delete(); // Deletes the directory and its contents.
copyTo(destPath); // Copies the directory and its tree.
moveTo(destPath); // Moves the directory to a new path.
}
```
#### Example
```js
const root = new Directory('root');
const subDir = root.addDir('subdir');
const file = root.addFile('subdir/file.txt', { size: 512 }, 'File Content');
console.log(root.getItem('subdir/file.txt') === file); // true
subDir.delete();
console.log(root.getItem('subdir/file.txt')); // null
```
---
### `File` Class
Extends `Item` and represents an individual file with content and metadata.
#### API
```js
class File extends Item {
constructor(name, meta, parent, content);
prepareMeta(meta = {}); // Prepares file metadata.
get buffer(); // Returns the file's buffer (increments access count).
save(value); // Saves new content to the file.
compare(content); // Compares the current buffer with new content.
delete(); // Deletes the file.
copyTo(destPath); // Copies the file to a new path.
moveTo(destPath); // Moves the file to a new path.
get lastAccessTime(); // Returns the last access time.
get age(); // Returns the file's age in hours.
get content(); // Returns the file's content as a string.
get json(); // Parses and returns the file's content as JSON.
}
```
#### Example
```js
const root = new Directory('root');
const file = root.addFile('example.json', {}, JSON.stringify({ key: 'value' }));
console.log(file.json); // Output: { key: 'value' }
file.save('New Content');
console.log(file.content); // Output: New Content
```
---
### `MemoryMonitor` Class
Manages memory usage by clearing file buffers when resources are low.
#### API
```js
class MemoryMonitor {
static get options(); // Returns global options.
filesWithContent; // Set of files with content in memory.
constructor();
get freeMemoryPercentage(); // Percentage of free system memory.
get isMemOk(); // Checks if memory is sufficient.
add(file); // Adds a file to memory management.
clear(force = false); // Clears memory by removing file buffers.
calculateRating(file); // Calculates a file's rating for clearing priority.
remove(...files); // Removes files from memory monitoring.
}
```
#### Example
```js
const memoryMonitor = new MemoryMonitor();
const root = new Directory('root');
const file = root.addFile('temp.txt', {}, 'Temporary Content');
memoryMonitor.add(file);
memoryMonitor.clear();
console.log(file.buffer); // null if memory is full
```
---
### Global Options
Configure thresholds, logging, and file rating.
#### Default Options
```js
{
logger: console,
thresholdRating: 3,
thresholdPercentage: 20,
maxStoreTime: 1000 * 60 * 60 * 24, // 24 hours
weights: {
accessCount: 5, // Higher priority for frequently accessed files.
lastAccess: -3, // Lower priority for older files.
size: -1, // Lower priority for larger files.
}
}
```
#### Example
```js
options.thresholdRating = 5;
options.logger = {
warn: msg => console.warn(`[Custom Logger] ${msg}`),
log: console.log,
error: console.error,
};
```
---
## Examples
### File and Directory Management
```js
const root = new Directory('root');
root.addDir('subdir');
root.addFile('subdir/example.txt', {}, 'Example Content');
const file = root.getItem('subdir/example.txt');
console.log(file.content); // Output: Example Content
```
### Memory Management
```js
const root = new Directory('root');
const file = root.addFile('largeFile.txt', {}, Buffer.alloc(1024 * 1024 * 10)); // 10 MB
MemoryMonitor.add(file);
MemoryMonitor.clear();
console.log(file.buffer); // null if memory is cleared
```
---
## Advanced Usage
### Replacing the `File` Class
You can replace the default `File` class with your custom implementation:
```js
class CustomFile extends File {
customMethod() {
console.log('Custom logic');
}
}
Directory.File = CustomFile;
```