@synet/fs-digitalocean
Version:
DigitalOcean Spaces filesystem abstraction following FileSystem pattern
129 lines (128 loc) • 4.07 kB
TypeScript
/**
* DigitalOcean Spaces FileSystem Implementation
*
* Provides async filesystem operations using DigitalOcean Spaces (S3-compatible) storage.
* Uses AWS SDK v3 for S3-compatible operations with DigitalOcean endpoints.
*
* Features:
* - Full S3-compatible API through DigitalOcean Spaces
* - Async-only operations (no sync support for cloud storage)
* - Intelligent caching for improved performance
* - Directory simulation using object prefixes
* - Concurrent operations support
* - Comprehensive error handling
*
* @example
* ```typescript
* import { createDigitalOceanSpacesFileSystem } from '@synet/fs';
*
* const doFS = createDigitalOceanSpacesFileSystem({
* endpoint: 'https://nyc3.digitaloceanspaces.com',
* accessKeyId: 'your-access-key',
* secretAccessKey: 'your-secret-key',
* bucket: 'my-space',
* region: 'nyc3'
* });
*
* await doFS.writeFile('config.json', JSON.stringify(config));
* const data = await doFS.readFile('config.json');
* ```
*/
import type { FileStats, IAsyncFileSystem } from "./filesystem.interface";
/**
* Configuration options for DigitalOcean Spaces FileSystem
*/
export interface DigitalOceanSpacesOptions {
/** DigitalOcean Spaces endpoint (e.g., https://nyc3.digitaloceanspaces.com) */
endpoint: string;
/** DO Spaces access key ID */
accessKeyId: string;
/** DO Spaces secret access key */
secretAccessKey: string;
/** DO Spaces bucket/space name */
bucket: string;
/** DO region (e.g., nyc3, sgp1, ams3) */
region: string;
/** Optional prefix for all operations (useful for namespacing) */
prefix?: string;
}
/**
* DigitalOcean Spaces FileSystem implementation using S3-compatible API
*
* Provides async filesystem operations against DigitalOcean Spaces storage,
* which is fully S3-compatible with some DigitalOcean-specific optimizations.
*/
export declare class DigitalOceanSpacesFileSystem implements IAsyncFileSystem {
private s3Client;
private options;
private cache;
constructor(options: DigitalOceanSpacesOptions);
/**
* Get the DO Spaces object key with prefix applied
*/
private getDOKey;
/**
* Remove prefix from DO Spaces object key to get local path
*/
private getLocalPath;
/**
* Check if an error is a "not found" error
*/
private isNotFoundError;
/**
* Convert DO Spaces response stream to string
*/
private streamToString; /**
* Read file content from DigitalOcean Spaces
*/
readFile(path: string): Promise<string>;
/**
* Write file content to DigitalOcean Spaces
*/
writeFile(path: string, content: string): Promise<void>;
/**
* Check if file exists in DigitalOcean Spaces
*/
exists(path: string): Promise<boolean>;
/**
* Delete file from DigitalOcean Spaces
*/
deleteFile(path: string): Promise<void>;
/**
* List directory contents (simulated using object prefixes)
*/
readDir(path: string): Promise<string[]>;
/**
* Delete directory and all its contents from DigitalOcean Spaces
*/
deleteDir(path: string): Promise<void>;
/**
* Get file statistics
*/
stat(path: string): Promise<FileStats>;
/**
* Get content type based on file extension
*/
private getContentType;
/**
* Ensure directory exists (no-op for DO Spaces as directories are virtual)
*/
ensureDir(path: string): Promise<void>;
/**
* Change file permissions (no-op for DO Spaces as it doesn't support POSIX permissions)
*/
chmod(path: string, mode: number): Promise<void>;
/**
* Get DigitalOcean Spaces bucket and configuration information
*/
getSpaceInfo(): {
bucket: string;
prefix: string;
region: string;
endpoint: string;
};
}
/**
* Factory function to create a new DigitalOcean Spaces FileSystem instance
*/
export declare function createDigitalOceanSpacesFileSystem(options: DigitalOceanSpacesOptions): DigitalOceanSpacesFileSystem;