UNPKG

@bernierllc/content-autosave-manager

Version:

Automatic content saving with debouncing, retry logic, and conflict detection

103 lines (102 loc) 2.79 kB
/** * 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; }