import { SolidDataset, Thing } from '@inrupt/solid-client'; /** * 合并策略类型 */ export type MergeStrategy = 'last-write-wins' | 'field-level-merge' | 'timestamp-based' | 'user-resolution'; /** * 冲突解析配置 */ export interface ConflictResolutionConfig { /** 最大重试次数 */ maxRetries?: number; /** 合并策略 */ strategy?: MergeStrategy; /** 用户自定义解析函数(当 strategy = 'user-resolution' 时使用) */ resolver?: (local: Thing, remote: Thing, predicates: string[]) => Thing; /** 重试延迟(毫秒) */ retryDelay?: number; /** 是否启用日志 */ logging?: boolean; } /** * 冲突解析结果 */ export interface ConflictResolutionResult { success: boolean; retries: number; strategy?: string; error?: string; } /** * 并发写入冲突解析器 * * 处理 412 Precondition Failed 错误(ETag 不匹配), * 通过不同的合并策略自动重试保存操作。 */ export declare class ConflictResolver { private config; private fetchFn; constructor(fetchFn: typeof fetch, config?: ConflictResolutionConfig); /** * 执行带冲突解析的保存操作 * * @param resourceUrl - 资源 URL * @param modifier - 修改函数,接收当前 dataset 并返回修改后的 dataset * @returns 解析结果 */ saveWithRetry(resourceUrl: string, modifier: (dataset: SolidDataset) => SolidDataset | Promise): Promise; /** * 执行带字段级合并的保存操作 * * @param resourceUrl - 资源 URL * @param thingUrl - Thing URL * @param localChanges - 本地修改的 Thing * @param predicates - 需要更新的谓词列表 * @returns 解析结果 */ saveThingWithMerge(resourceUrl: string, thingUrl: string, localChanges: Thing, predicates: string[]): Promise; /** * 合并两个 Thing * * @param local - 本地版本(包含我们的修改) * @param remote - 远程版本(最新状态) * @param predicates - 需要合并的谓词列表 * @returns 合并后的 Thing */ private mergeThings; /** * 字段级合并 * * 策略: * - 对于 predicates 中的谓词,使用本地版本 * - 对于其他谓词,保留远程版本 */ private fieldLevelMerge; /** * 基于时间戳的合并 * * 策略: * - 如果有 updatedAt 字段,比较时间戳,选择最新的 * - 否则 fallback 到 field-level-merge */ private timestampBasedMerge; /** * 获取 Thing 的 updatedAt 时间戳 */ private getUpdatedAt; /** * 获取谓词的值(支持多种类型) */ private getPredicateValue; /** * 设置谓词的值(根据类型) * * 注意:这是简化实现,实际使用时应该用 buildThing 模式 */ private setPredicateValue; /** * 延迟函数 */ private delay; } /** * 便捷函数:使用默认配置创建冲突解析器 */ export declare function createConflictResolver(fetchFn: typeof fetch, config?: ConflictResolutionConfig): ConflictResolver; /** * 便捷函数:执行单次带重试的保存操作 */ export declare function saveWithConflictResolution(fetchFn: typeof fetch, resourceUrl: string, modifier: (dataset: SolidDataset) => SolidDataset | Promise, config?: ConflictResolutionConfig): Promise; //# sourceMappingURL=conflict-resolution.d.ts.map