@bernierllc/content-autosave-manager
Version:
Automatic content saving with debouncing, retry logic, and conflict detection
103 lines (102 loc) • 2.79 kB
TypeScript
/**
* Autosave status for a content item
*/
export type AutosaveStatus = 'idle' | 'saving' | 'saved' | 'error';
/**
* Configuration for autosave behavior
*/
export interface AutosaveConfig {
/** Milliseconds of inactivity before triggering save (default: 2000) */
debounceMs?: number;
/** Maximum retry attempts for failed saves (default: 3) */
maxRetries?: number;
/** Retry strategy from backoff-retry (default: 'exponential') */
retryStrategy?: 'exponential' | 'linear' | 'fibonacci';
/** Enable version tracking for drafts (default: true) */
enableVersioning?: boolean;
/** Enable conflict detection (default: true) */
enableConflictDetection?: boolean;
}
/**
* Save function provided by consumer
*/
export type SaveFunction<T = any> = (contentId: string, content: T, version?: number) => Promise<SaveResult<T>>;
/**
* Result from save operation
*/
export interface SaveResult<T = any> {
success: boolean;
version?: number;
conflict?: boolean;
serverContent?: T;
error?: string;
}
/**
* Autosave status event
*/
export interface AutosaveStatusEvent {
contentId: string;
status: AutosaveStatus;
version?: number;
lastSaved?: Date;
error?: string;
}
/**
* Conflict event
*/
export interface ConflictEvent<T = any> {
contentId: string;
localContent: T;
localVersion: number;
serverContent: T;
serverVersion: number;
}
/**
* Conflict resolution strategy
*/
export type ConflictResolution = 'local' | 'server' | 'manual';
/**
* Conflict handler function
*/
export type ConflictHandler<T = any> = (event: ConflictEvent<T>) => Promise<ConflictResolution>;
/**
* Main autosave manager interface
*/
export interface IAutosaveManager<T = any> {
/**
* Enable autosave for content item
*/
enable(contentId: string, saveFunction: SaveFunction<T>, config?: Partial<AutosaveConfig>): void;
/**
* Disable autosave for content item
*/
disable(contentId: string): void;
/**
* Queue content for autosave (triggers debounced save)
*/
queueSave(contentId: string, content: T): void;
/**
* Force immediate save (bypasses debouncing)
*/
forceSave(contentId: string, content: T): Promise<SaveResult<T>>;
/**
* Get current autosave status
*/
getStatus(contentId: string): AutosaveStatusEvent | null;
/**
* Register conflict handler
*/
onConflict(handler: ConflictHandler<T>): void;
/**
* Register status change listener
*/
onStatusChange(listener: (event: AutosaveStatusEvent) => void): void;
/**
* Clear all autosave state for content item
*/
clear(contentId: string): void;
/**
* Cleanup all autosave state
*/
destroy(): void;
}