@yihuangdb/storage-object
Version:
A Node.js storage object layer library using Redis OM
86 lines • 2.69 kB
TypeScript
import { RedisClientType } from 'redis';
export declare class SchemaLockError extends Error {
readonly expectedVersion: number;
readonly actualVersion: number;
readonly schemaName: string;
constructor(message: string, expectedVersion: number, actualVersion: number, schemaName: string);
}
export interface SchemaUpdateOptions {
expectedVersion?: number;
retryOnConflict?: boolean;
maxRetries?: number;
lockTimeout?: number;
}
export interface SchemaMetadata {
version: number;
fields: string;
indexes: string;
dataStructure: 'JSON' | 'HASH';
entityCount: string;
dataVersion: string;
lastDataChange: string;
libraryVersion: string;
createdAt: string;
updatedAt: string;
lastAccessed: string;
}
export declare class SchemaVersionManager {
private client;
private schemaName;
private hashKey;
private hllKey;
private versionsKey;
private keyManager;
private readonly defaultMaxRetries;
private readonly defaultLockTimeout;
constructor(schemaName: string, client: RedisClientType);
/**
* Store schema metadata in HashMap with locking
*/
saveMetadata(metadata: Partial<SchemaMetadata>, options?: SchemaUpdateOptions): Promise<void>;
/**
* Internal method to save metadata with WATCH/MULTI/EXEC
*/
private _saveMetadataWithLock;
/**
* Get schema metadata from HashMap
*/
getMetadata(): Promise<SchemaMetadata | null>;
/**
* Increment version ONLY for structure changes with atomic locking
*/
incrementVersion(reason: string, options?: SchemaUpdateOptions): Promise<number>;
/**
* Track entity creation with HyperLogLog (atomic operation)
*/
trackEntity(entityId: string): Promise<void>;
/**
* Get entity count from HyperLogLog
*/
getEntityCount(): Promise<number>;
/**
* Add version to history sorted set (now handled atomically in incrementVersion)
*/
recordVersionHistory(version: number, timestamp: number, reason?: string): Promise<void>;
/**
* Get version history from sorted set
*/
getVersionHistory(): Promise<Array<{
version: number;
timestamp: number;
reason?: string;
}>>;
/**
* Check if structure changed (for version increment)
*/
isStructuralChange(oldFields: string, newFields: string): boolean;
/**
* Initialize schema metadata
*/
initialize(fields: any, indexes: string[], dataStructure: 'JSON' | 'HASH'): Promise<void>;
/**
* Clean up all schema-related keys
*/
cleanup(): Promise<void>;
}
//# sourceMappingURL=schema-versioning.d.ts.map