UNPKG

delta-sync

Version:

A lightweight framework for bi-directional database synchronization with automatic version tracking and conflict resolution.

109 lines (108 loc) 3.86 kB
// CloudCoordinator.ts // 云端的协调层 export class CloudCoordinator { constructor(cloudAdapter) { this.CHANGES_STORE = 'cloud_synced_changes'; // 所有变更的存储 this.ATTACHMENT_CHANGES_STORE = 'cloud_attachment_changes'; // 新增附件变更表 this.cloudAdapter = cloudAdapter; } // 处理来自客户端的同步请求 async applyChanges(changes) { try { // 获取服务器当前时间戳作为版本号 const serverTimestamp = Date.now(); const updatedChanges = changes.map(change => ({ ...change, _version: serverTimestamp })); await this.cloudAdapter.putBulk(this.CHANGES_STORE, updatedChanges); return { success: true, processed: changes.length, version: serverTimestamp, // 使用服务器时间戳作为版本号 changes: updatedChanges // 可选:返回更新后的变更记录 }; } catch (error) { console.error('处理同步请求时出错:', error); return { success: false, error: this.getErrorMessage(error) }; } } async applyAttachmentChanges(changes) { try { await this.cloudAdapter.putBulk(this.ATTACHMENT_CHANGES_STORE, changes); const latestVersion = await this.getLatestVersion(); return { success: true, processed: changes.length, version: latestVersion, // 使用实际的最新版本号 info: { attachments_processed: changes.length } }; } catch (error) { return { success: false, error: this.getErrorMessage(error) }; } } async getAttachmentChanges(since) { const result = await this.cloudAdapter.readByVersion(this.ATTACHMENT_CHANGES_STORE, { since }); return result.items; } // 处理来自客户端的拉取请求(使用 since 参数表示最小版本号) async getPendingChanges(since) { try { const result = await this.cloudAdapter.readByVersion(this.CHANGES_STORE, { since }); console.log("从云端读取更新成功", result); const latestVersion = await this.getLatestVersion(); return { success: true, changes: result.items, version: latestVersion, }; } catch (error) { console.error('获取变更失败:', error); return { success: false, error: this.getErrorMessage(error) }; } } // 辅助方法,在结果中附加详细错误 getErrorMessage(error) { if (error instanceof Error) { return error.message; } else if (typeof error === 'string') { return error; } else if (error && typeof error === 'object' && 'message' in error) { return String(error.message); } return '未知错误'; } // 获取最新变更的版本号(优化查询方式) async getLatestVersion() { try { const result = await this.cloudAdapter.readByVersion(this.CHANGES_STORE, { limit: 1, order: 'desc' // 直接使用倒序排列 }); if (result.items.length > 0 && result.items[0]._version !== undefined) { return result.items[0]._version; } return 0; } catch (error) { console.error('获取最新版本号失败:', error); return 0; } } }