delta-sync
Version:
A lightweight framework for bi-directional database synchronization with automatic version tracking and conflict resolution.
154 lines (153 loc) • 4.82 kB
TypeScript
export type SyncOperationType = 'put' | 'delete';
export interface SyncQueryOptions {
since?: number;
limit?: number;
offset?: number;
includeDeleted?: boolean;
}
export interface SyncQueryResult<T = any> {
items: T[];
hasMore: boolean;
}
export interface SyncProgress {
processed: number;
total: number;
}
export interface SyncResult {
success: boolean;
error?: string;
syncedAt?: number;
stats?: {
uploaded: number;
downloaded: number;
errors: number;
};
}
export declare enum SyncStatus {
ERROR = -2,// Error status
OFFLINE = -1,// Offline status
IDLE = 0,// Idle status
UPLOADING = 1,// Upload synchronization in progress
DOWNLOADING = 2,// Download synchronization in progress
OPERATING = 3
}
export interface SyncOptions {
autoSync?: {
enabled?: boolean;
pullInterval?: number;
pushDebounce?: number;
retryDelay?: number;
};
onStatusUpdate?: (status: SyncStatus) => void;
onVersionUpdate?: (_ver: number) => void;
onChangePushed?: (changes: DataChangeSet) => void;
onChangePulled?: (changes: DataChangeSet) => void;
onPullAvailableCheck?: () => boolean;
onPushAvailableCheck?: () => boolean;
maxRetries?: number;
timeout?: number;
batchSize?: number;
payloadSize?: number;
maxFileSize?: number;
fileChunkSize?: number;
}
export interface SyncViewItem {
id: string;
store: string;
_ver: number;
deleted?: boolean;
isAttachment?: boolean;
}
export interface DeletedItem extends Record<string, any> {
id: string;
_ver: number;
deleted: boolean;
}
export interface DataChange<T = any> {
id: string;
_ver: number;
data?: T;
}
export interface DataChangeSet {
delete: Map<string, DataChange[]>;
put: Map<string, DataChange[]>;
}
export declare class SyncView {
private items;
private storeIndex;
constructor();
upsert(item: SyncViewItem): void;
upsertBatch(items: SyncViewItem[]): void;
get(store: string, id: string): SyncViewItem | undefined;
getByStore(store: string, offset?: number, limit?: number): SyncViewItem[];
getStores(): string[];
static diffViews(local: SyncView, remote: SyncView): {
toDownload: SyncViewItem[];
toUpload: SyncViewItem[];
};
private getKey;
delete(store: string, id: string): void;
size(): number;
storeSize(store: string): number;
clear(): void;
countByStore(store: string, includeDeleted?: boolean): number;
}
export interface DatabaseAdapter {
readStore<T extends {
id: string;
}>(storeName: string, limit?: number, offset?: number): Promise<{
items: T[];
hasMore: boolean;
}>;
readBulk<T extends {
id: string;
}>(storeName: string, ids: string[]): Promise<T[]>;
putBulk<T extends {
id: string;
}>(storeName: string, items: T[]): Promise<T[]>;
deleteBulk(storeName: string, ids: string[]): Promise<void>;
clearStore(storeName: string): Promise<boolean>;
getStores(): Promise<string[]>;
}
export interface ICoordinator {
initSync?: () => Promise<void>;
disposeSync?: () => Promise<void>;
query<T extends {
id: string;
}>(storeName: string, options?: SyncQueryOptions): Promise<SyncQueryResult<T>>;
getCurrentView(): Promise<SyncView>;
readBulk<T extends {
id: string;
}>(storeName: string, ids: string[]): Promise<T[]>;
putBulk<T extends {
id: string;
}>(storeName: string, items: T[]): Promise<T[]>;
deleteBulk(storeName: string, ids: string[]): Promise<void>;
extractChanges(items: SyncViewItem[]): Promise<DataChangeSet>;
applyChanges(changeSet: DataChangeSet): Promise<void>;
}
export interface ISyncEngine {
initialize(): Promise<void>;
enableAutoSync(interval?: number): void;
disableAutoSync(): void;
updateSyncOptions(options: Partial<SyncOptions>): SyncOptions;
setCloudAdapter(cloudAdapter: DatabaseAdapter): Promise<void>;
save<T extends {
id: string;
}>(storeName: string, data: T | T[]): Promise<T[]>;
delete(storeName: string, ids: string | string[]): Promise<void>;
sync(): Promise<SyncResult>;
push(): Promise<SyncResult>;
pull(): Promise<SyncResult>;
query<T extends {
id: string;
}>(storeName: string, options?: SyncQueryOptions): Promise<SyncQueryResult<T>>;
clearCloudStores(strings: string | string[]): Promise<void>;
clearLocalStores(strings: string | string[]): Promise<void>;
getlocalAdapter(): DatabaseAdapter;
getlocalCoordinator(): ICoordinator;
getCloudAdapter(): DatabaseAdapter | undefined;
getCloudCoordinator(): ICoordinator | undefined;
dispose(): void;
disconnectCloud(): void;
}