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
JavaScript
// 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;
}
}
}