A super-fast, promise-based cache that reads and writes to the file-system
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Core caching operations for storing, retrieving, and removing data with both asynchronous and synchronous methods.
Retrieves cached values asynchronously with support for default values.
/**
* Gets the contents of the cached file with the given key
* @param key - The cache key to retrieve
* @param defaultValue - Optional default value if key doesn't exist
* @returns Promise resolving to cached value or defaultValue
*/
get(key: string, defaultValue?: any): Promise<any>;Usage Examples:
// Basic retrieval
const userData = await cache.get("user:123");
// With default value
const settings = await cache.get("app:settings", { theme: "light" });
// Type-safe retrieval with defaults
interface User {
name: string;
email: string;
}
const user: User = await cache.get("user:456", {
name: "Unknown",
email: "unknown@example.com"
});Retrieves cached values synchronously for immediate access.
/**
* Gets the contents of the cached file with the given key synchronously
* @param key - The cache key to retrieve
* @param defaultValue - Optional default value if key doesn't exist
* @returns Cached value or defaultValue, or undefined if not found
*/
getSync(key: string, defaultValue?: any): any;Usage Examples:
// Synchronous retrieval
const config = cache.getSync("app:config");
// With default value
const theme = cache.getSync("user:theme", "light");
// Error handling
try {
const data = cache.getSync("critical:data");
if (data === undefined) {
console.log("Data not found in cache");
}
} catch (error) {
console.error("Cache read error:", error);
}Stores data asynchronously with optional TTL override.
/**
* Writes the given value to the file system cache
* @param key - The cache key to store under
* @param value - The value to cache (any serializable type)
* @param ttl - Optional TTL override in seconds
* @returns Promise resolving to object with file path
*/
set(key: string, value: any, ttl?: number): Promise<{path: string}>;Usage Examples:
// Basic storage
await cache.set("user:789", { name: "Bob", active: true });
// With custom TTL (10 minutes)
const result = await cache.set("session:abc123", sessionData, 600);
console.log(`Stored at: ${result.path}`);
// Store complex data types
await cache.set("api:response", {
data: [1, 2, 3],
timestamp: new Date(),
metadata: { version: "1.0" }
});
// Store with no expiration (override default TTL)
await cache.set("permanent:config", config, 0);Stores data synchronously for immediate persistence.
/**
* Writes the given value to the file system cache synchronously
* @param key - The cache key to store under
* @param value - The value to cache (any serializable type)
* @param ttl - Optional TTL override in seconds
* @returns The cache instance for method chaining
*/
setSync(key: string, value: any, ttl?: number): FileSystemCache;Usage Examples:
// Basic synchronous storage
cache.setSync("counter", 42);
// Method chaining
cache
.setSync("user:name", "Alice")
.setSync("user:age", 30)
.setSync("user:active", true);
// With TTL override
cache.setSync("temp:token", "abc123", 300); // 5 minutes
// Store and continue
cache.setSync("last:action", "login");
console.log("Action logged to cache");Removes specific cached items from the file system.
/**
* Removes the cached item with the given key from the file system
* @param key - The cache key to remove
* @returns Promise that resolves when removal is complete
*/
remove(key: string): Promise<void>;Usage Examples:
// Remove specific item
await cache.remove("user:123");
// Remove session data
await cache.remove("session:expired");
// Remove multiple items
const keysToRemove = ["temp:data1", "temp:data2", "temp:data3"];
await Promise.all(keysToRemove.map(key => cache.remove(key)));
// Conditional removal
const userData = await cache.get("user:456");
if (userData && userData.expired) {
await cache.remove("user:456");
}The cache automatically handles JSON serialization and deserialization:
// Primitives
await cache.set("string", "hello");
await cache.set("number", 42);
await cache.set("boolean", true);
await cache.set("null", null);
// Objects and arrays
await cache.set("object", { name: "Alice", tags: ["user", "admin"] });
await cache.set("array", [1, 2, 3, 4, 5]);
// Dates (special handling)
await cache.set("date", new Date());
const retrievedDate = await cache.get("date"); // Returns Date object
// Complex nested structures
await cache.set("complex", {
users: [
{ id: 1, profile: { name: "Alice", settings: { theme: "dark" } } },
{ id: 2, profile: { name: "Bob", settings: { theme: "light" } } }
],
metadata: {
created: new Date(),
version: "2.1.0"
}
});// Set item with 1 hour TTL
await cache.set("session", sessionData, 3600);
// Item automatically expires and returns undefined
setTimeout(async () => {
const expired = await cache.get("session"); // undefined
}, 3600 * 1000 + 1000);
// Check before expiration
const fresh = await cache.get("session"); // Returns sessionData// Handle missing keys gracefully
const user = await cache.get("nonexistent:user", { name: "Guest" });
// Handle cache key validation errors
try {
await cache.set("", "empty key"); // Throws error
} catch (error) {
console.error("Invalid cache key:", error.message);
}
// Handle file system errors
try {
await cache.set("data", largeObject);
} catch (error) {
if (error.code === 'ENOSPC') {
console.error("Disk full, cannot write to cache");
}
}