@nahisaho/yata-scale 1.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -0
- package/dist/CacheManager.d.ts +107 -0
- package/dist/CacheManager.d.ts.map +1 -0
- package/dist/CacheManager.js +343 -0
- package/dist/CacheManager.js.map +1 -0
- package/dist/IndexManager.d.ts +103 -0
- package/dist/IndexManager.d.ts.map +1 -0
- package/dist/IndexManager.js +385 -0
- package/dist/IndexManager.js.map +1 -0
- package/dist/MigrationHelper.d.ts +91 -0
- package/dist/MigrationHelper.d.ts.map +1 -0
- package/dist/MigrationHelper.js +220 -0
- package/dist/MigrationHelper.js.map +1 -0
- package/dist/QueryCoordinator.d.ts +76 -0
- package/dist/QueryCoordinator.d.ts.map +1 -0
- package/dist/QueryCoordinator.js +298 -0
- package/dist/QueryCoordinator.js.map +1 -0
- package/dist/ShardManager.d.ts +48 -0
- package/dist/ShardManager.d.ts.map +1 -0
- package/dist/ShardManager.js +193 -0
- package/dist/ShardManager.js.map +1 -0
- package/dist/SyncController.d.ts +102 -0
- package/dist/SyncController.d.ts.map +1 -0
- package/dist/SyncController.js +286 -0
- package/dist/SyncController.js.map +1 -0
- package/dist/YataScaleManager.d.ts +75 -0
- package/dist/YataScaleManager.d.ts.map +1 -0
- package/dist/YataScaleManager.js +265 -0
- package/dist/YataScaleManager.js.map +1 -0
- package/dist/cache/CacheManager.d.ts +116 -0
- package/dist/cache/CacheManager.d.ts.map +1 -0
- package/dist/cache/CacheManager.js +286 -0
- package/dist/cache/CacheManager.js.map +1 -0
- package/dist/cache/InvalidationManager.d.ts +91 -0
- package/dist/cache/InvalidationManager.d.ts.map +1 -0
- package/dist/cache/InvalidationManager.js +155 -0
- package/dist/cache/InvalidationManager.js.map +1 -0
- package/dist/cache/L1Cache.d.ts +97 -0
- package/dist/cache/L1Cache.d.ts.map +1 -0
- package/dist/cache/L1Cache.js +225 -0
- package/dist/cache/L1Cache.js.map +1 -0
- package/dist/cache/L2Cache.d.ts +93 -0
- package/dist/cache/L2Cache.d.ts.map +1 -0
- package/dist/cache/L2Cache.js +248 -0
- package/dist/cache/L2Cache.js.map +1 -0
- package/dist/cache/L3Cache.d.ts +101 -0
- package/dist/cache/L3Cache.d.ts.map +1 -0
- package/dist/cache/L3Cache.js +229 -0
- package/dist/cache/L3Cache.js.map +1 -0
- package/dist/cache/index.d.ts +12 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +11 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/errors.d.ts +255 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +515 -0
- package/dist/errors.js.map +1 -0
- package/dist/index/BPlusTreeIndex.d.ts +101 -0
- package/dist/index/BPlusTreeIndex.d.ts.map +1 -0
- package/dist/index/BPlusTreeIndex.js +310 -0
- package/dist/index/BPlusTreeIndex.js.map +1 -0
- package/dist/index/BloomFilter.d.ts +85 -0
- package/dist/index/BloomFilter.d.ts.map +1 -0
- package/dist/index/BloomFilter.js +215 -0
- package/dist/index/BloomFilter.js.map +1 -0
- package/dist/index/FullTextIndex.d.ts +87 -0
- package/dist/index/FullTextIndex.d.ts.map +1 -0
- package/dist/index/FullTextIndex.js +213 -0
- package/dist/index/FullTextIndex.js.map +1 -0
- package/dist/index/GraphIndex.d.ts +116 -0
- package/dist/index/GraphIndex.d.ts.map +1 -0
- package/dist/index/GraphIndex.js +308 -0
- package/dist/index/GraphIndex.js.map +1 -0
- package/dist/index/IndexManager.d.ts +105 -0
- package/dist/index/IndexManager.d.ts.map +1 -0
- package/dist/index/IndexManager.js +287 -0
- package/dist/index/IndexManager.js.map +1 -0
- package/dist/index/index.d.ts +12 -0
- package/dist/index/index.d.ts.map +1 -0
- package/dist/index/index.js +11 -0
- package/dist/index/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/query/DistributedExecutor.d.ts +78 -0
- package/dist/query/DistributedExecutor.d.ts.map +1 -0
- package/dist/query/DistributedExecutor.js +232 -0
- package/dist/query/DistributedExecutor.js.map +1 -0
- package/dist/query/QueryCoordinator.d.ts +98 -0
- package/dist/query/QueryCoordinator.d.ts.map +1 -0
- package/dist/query/QueryCoordinator.js +246 -0
- package/dist/query/QueryCoordinator.js.map +1 -0
- package/dist/query/QueryPlanner.d.ts +88 -0
- package/dist/query/QueryPlanner.d.ts.map +1 -0
- package/dist/query/QueryPlanner.js +235 -0
- package/dist/query/QueryPlanner.js.map +1 -0
- package/dist/query/WorkerPool.d.ts +108 -0
- package/dist/query/WorkerPool.d.ts.map +1 -0
- package/dist/query/WorkerPool.js +195 -0
- package/dist/query/WorkerPool.js.map +1 -0
- package/dist/query/index.d.ts +11 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +10 -0
- package/dist/query/index.js.map +1 -0
- package/dist/shard/GraphPartitionStrategy.d.ts +65 -0
- package/dist/shard/GraphPartitionStrategy.d.ts.map +1 -0
- package/dist/shard/GraphPartitionStrategy.js +208 -0
- package/dist/shard/GraphPartitionStrategy.js.map +1 -0
- package/dist/shard/HashPartitionStrategy.d.ts +56 -0
- package/dist/shard/HashPartitionStrategy.d.ts.map +1 -0
- package/dist/shard/HashPartitionStrategy.js +169 -0
- package/dist/shard/HashPartitionStrategy.js.map +1 -0
- package/dist/shard/RangePartitionStrategy.d.ts +63 -0
- package/dist/shard/RangePartitionStrategy.d.ts.map +1 -0
- package/dist/shard/RangePartitionStrategy.js +157 -0
- package/dist/shard/RangePartitionStrategy.js.map +1 -0
- package/dist/shard/Rebalancer.d.ts +70 -0
- package/dist/shard/Rebalancer.d.ts.map +1 -0
- package/dist/shard/Rebalancer.js +184 -0
- package/dist/shard/Rebalancer.js.map +1 -0
- package/dist/shard/ShardManager.d.ts +123 -0
- package/dist/shard/ShardManager.d.ts.map +1 -0
- package/dist/shard/ShardManager.js +353 -0
- package/dist/shard/ShardManager.js.map +1 -0
- package/dist/shard/ShardRouter.d.ts +102 -0
- package/dist/shard/ShardRouter.d.ts.map +1 -0
- package/dist/shard/ShardRouter.js +181 -0
- package/dist/shard/ShardRouter.js.map +1 -0
- package/dist/shard/index.d.ts +13 -0
- package/dist/shard/index.d.ts.map +1 -0
- package/dist/shard/index.js +12 -0
- package/dist/shard/index.js.map +1 -0
- package/dist/sync/ConflictResolver.d.ts +71 -0
- package/dist/sync/ConflictResolver.d.ts.map +1 -0
- package/dist/sync/ConflictResolver.js +214 -0
- package/dist/sync/ConflictResolver.js.map +1 -0
- package/dist/sync/SyncController.d.ts +150 -0
- package/dist/sync/SyncController.d.ts.map +1 -0
- package/dist/sync/SyncController.js +304 -0
- package/dist/sync/SyncController.js.map +1 -0
- package/dist/sync/VectorClock.d.ts +102 -0
- package/dist/sync/VectorClock.d.ts.map +1 -0
- package/dist/sync/VectorClock.js +189 -0
- package/dist/sync/VectorClock.js.map +1 -0
- package/dist/sync/WALManager.d.ts +120 -0
- package/dist/sync/WALManager.d.ts.map +1 -0
- package/dist/sync/WALManager.js +240 -0
- package/dist/sync/WALManager.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +10 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/types.d.ts +323 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Shard Module
|
|
3
|
+
*
|
|
4
|
+
* Exports for shard management functionality
|
|
5
|
+
*/
|
|
6
|
+
export { ShardManager } from './ShardManager.js';
|
|
7
|
+
export { HashPartitionStrategy } from './HashPartitionStrategy.js';
|
|
8
|
+
export { RangePartitionStrategy } from './RangePartitionStrategy.js';
|
|
9
|
+
export { GraphPartitionStrategy } from './GraphPartitionStrategy.js';
|
|
10
|
+
export { ShardRouter } from './ShardRouter.js';
|
|
11
|
+
export { Rebalancer } from './Rebalancer.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shard/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Conflict Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves conflicts in distributed updates
|
|
5
|
+
*/
|
|
6
|
+
import type { Entity, Relationship, Conflict, ConflictResolution } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Conflict resolution strategy
|
|
9
|
+
*/
|
|
10
|
+
export type ResolutionStrategy = 'last-writer-wins' | 'first-writer-wins' | 'merge' | 'custom';
|
|
11
|
+
/**
|
|
12
|
+
* Custom resolver function
|
|
13
|
+
*/
|
|
14
|
+
export type CustomResolver<T> = (local: T, remote: T, conflict: Conflict) => T;
|
|
15
|
+
/**
|
|
16
|
+
* Conflict resolver for distributed updates
|
|
17
|
+
*/
|
|
18
|
+
export declare class ConflictResolver {
|
|
19
|
+
private readonly defaultStrategy;
|
|
20
|
+
private readonly customResolvers;
|
|
21
|
+
constructor(defaultStrategy?: ResolutionStrategy);
|
|
22
|
+
/**
|
|
23
|
+
* Register custom resolver for entity type
|
|
24
|
+
*/
|
|
25
|
+
registerResolver<T>(entityType: string, resolver: CustomResolver<T>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Detect conflict between two entities
|
|
28
|
+
*/
|
|
29
|
+
detectEntityConflict(local: Entity, remote: Entity): Conflict | null;
|
|
30
|
+
/**
|
|
31
|
+
* Find conflicting fields between two entities
|
|
32
|
+
*/
|
|
33
|
+
private findConflictingFields;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve entity conflict
|
|
36
|
+
*/
|
|
37
|
+
resolveEntityConflict(local: Entity, remote: Entity, conflict: Conflict): ConflictResolution;
|
|
38
|
+
/**
|
|
39
|
+
* Last writer wins resolution
|
|
40
|
+
*/
|
|
41
|
+
private lastWriterWins;
|
|
42
|
+
/**
|
|
43
|
+
* First writer wins resolution
|
|
44
|
+
*/
|
|
45
|
+
private firstWriterWins;
|
|
46
|
+
/**
|
|
47
|
+
* Merge entities (field-level LWW)
|
|
48
|
+
*/
|
|
49
|
+
private mergeEntities;
|
|
50
|
+
/**
|
|
51
|
+
* Resolve relationship conflict
|
|
52
|
+
*/
|
|
53
|
+
resolveRelationshipConflict(local: Relationship, remote: Relationship): ConflictResolution;
|
|
54
|
+
/**
|
|
55
|
+
* Batch resolve conflicts
|
|
56
|
+
*/
|
|
57
|
+
resolveAll(conflicts: Array<{
|
|
58
|
+
local: Entity;
|
|
59
|
+
remote: Entity;
|
|
60
|
+
conflict: Conflict;
|
|
61
|
+
}>): ConflictResolution[];
|
|
62
|
+
/**
|
|
63
|
+
* Get default strategy
|
|
64
|
+
*/
|
|
65
|
+
getDefaultStrategy(): ResolutionStrategy;
|
|
66
|
+
/**
|
|
67
|
+
* Check if custom resolver exists
|
|
68
|
+
*/
|
|
69
|
+
hasCustomResolver(entityType: string): boolean;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=ConflictResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictResolver.d.ts","sourceRoot":"","sources":["../../src/sync/ConflictResolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAGrB;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,mBAAmB,GACnB,OAAO,GACP,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAC9B,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,QAAQ,KACf,CAAC,CAAC;AAEP;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqB;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmD;gBAEvE,eAAe,GAAE,kBAAuC;IAIpE;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAI1E;;OAEG;IACH,oBAAoB,CAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,QAAQ,GAAG,IAAI;IAuBlB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,qBAAqB,CACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,GACjB,kBAAkB;IA4BrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiErB;;OAEG;IACH,2BAA2B,CACzB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,YAAY,GACnB,kBAAkB;IAcrB;;OAEG;IACH,UAAU,CACR,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC,GACtE,kBAAkB,EAAE;IAMvB;;OAEG;IACH,kBAAkB,IAAI,kBAAkB;IAIxC;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;CAG/C"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Conflict Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves conflicts in distributed updates
|
|
5
|
+
*/
|
|
6
|
+
import { VectorClock } from './VectorClock.js';
|
|
7
|
+
/**
|
|
8
|
+
* Conflict resolver for distributed updates
|
|
9
|
+
*/
|
|
10
|
+
export class ConflictResolver {
|
|
11
|
+
defaultStrategy;
|
|
12
|
+
customResolvers = new Map();
|
|
13
|
+
constructor(defaultStrategy = 'last-writer-wins') {
|
|
14
|
+
this.defaultStrategy = defaultStrategy;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register custom resolver for entity type
|
|
18
|
+
*/
|
|
19
|
+
registerResolver(entityType, resolver) {
|
|
20
|
+
this.customResolvers.set(entityType, resolver);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Detect conflict between two entities
|
|
24
|
+
*/
|
|
25
|
+
detectEntityConflict(local, remote) {
|
|
26
|
+
if (local.id !== remote.id) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const localClock = new VectorClock(local.metadata.vectorClock);
|
|
30
|
+
const remoteClock = new VectorClock(remote.metadata.vectorClock);
|
|
31
|
+
if (localClock.isConcurrentWith(remoteClock)) {
|
|
32
|
+
return {
|
|
33
|
+
type: 'update-update',
|
|
34
|
+
entityId: local.id,
|
|
35
|
+
localVersion: local.metadata.version,
|
|
36
|
+
remoteVersion: remote.metadata.version,
|
|
37
|
+
localTimestamp: local.metadata.updatedAt,
|
|
38
|
+
remoteTimestamp: remote.metadata.updatedAt,
|
|
39
|
+
conflictingFields: this.findConflictingFields(local, remote),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Find conflicting fields between two entities
|
|
46
|
+
*/
|
|
47
|
+
findConflictingFields(local, remote) {
|
|
48
|
+
const conflicts = [];
|
|
49
|
+
// Check name
|
|
50
|
+
if (local.name !== remote.name) {
|
|
51
|
+
conflicts.push('name');
|
|
52
|
+
}
|
|
53
|
+
// Check namespace
|
|
54
|
+
if (local.namespace !== remote.namespace) {
|
|
55
|
+
conflicts.push('namespace');
|
|
56
|
+
}
|
|
57
|
+
// Check attributes
|
|
58
|
+
const allKeys = new Set([
|
|
59
|
+
...Object.keys(local.attributes),
|
|
60
|
+
...Object.keys(remote.attributes),
|
|
61
|
+
]);
|
|
62
|
+
for (const key of allKeys) {
|
|
63
|
+
const localVal = local.attributes[key];
|
|
64
|
+
const remoteVal = remote.attributes[key];
|
|
65
|
+
if (JSON.stringify(localVal) !== JSON.stringify(remoteVal)) {
|
|
66
|
+
conflicts.push(`attributes.${key}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return conflicts;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolve entity conflict
|
|
73
|
+
*/
|
|
74
|
+
resolveEntityConflict(local, remote, conflict) {
|
|
75
|
+
// Check for custom resolver
|
|
76
|
+
const customResolver = this.customResolvers.get(local.type);
|
|
77
|
+
if (customResolver) {
|
|
78
|
+
const resolved = customResolver(local, remote, conflict);
|
|
79
|
+
return {
|
|
80
|
+
resolution: 'merged',
|
|
81
|
+
winner: resolved,
|
|
82
|
+
mergedFields: conflict.conflictingFields,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Use default strategy
|
|
86
|
+
switch (this.defaultStrategy) {
|
|
87
|
+
case 'last-writer-wins':
|
|
88
|
+
return this.lastWriterWins(local, remote, conflict);
|
|
89
|
+
case 'first-writer-wins':
|
|
90
|
+
return this.firstWriterWins(local, remote, conflict);
|
|
91
|
+
case 'merge':
|
|
92
|
+
return this.mergeEntities(local, remote, conflict);
|
|
93
|
+
default:
|
|
94
|
+
return this.lastWriterWins(local, remote, conflict);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Last writer wins resolution
|
|
99
|
+
*/
|
|
100
|
+
lastWriterWins(local, remote, conflict) {
|
|
101
|
+
const winner = local.metadata.updatedAt > remote.metadata.updatedAt
|
|
102
|
+
? local
|
|
103
|
+
: remote;
|
|
104
|
+
return {
|
|
105
|
+
resolution: local.metadata.updatedAt > remote.metadata.updatedAt
|
|
106
|
+
? 'local-wins'
|
|
107
|
+
: 'remote-wins',
|
|
108
|
+
winner,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* First writer wins resolution
|
|
113
|
+
*/
|
|
114
|
+
firstWriterWins(local, remote, conflict) {
|
|
115
|
+
const winner = local.metadata.updatedAt < remote.metadata.updatedAt
|
|
116
|
+
? local
|
|
117
|
+
: remote;
|
|
118
|
+
return {
|
|
119
|
+
resolution: local.metadata.updatedAt < remote.metadata.updatedAt
|
|
120
|
+
? 'local-wins'
|
|
121
|
+
: 'remote-wins',
|
|
122
|
+
winner,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Merge entities (field-level LWW)
|
|
127
|
+
*/
|
|
128
|
+
mergeEntities(local, remote, conflict) {
|
|
129
|
+
// Start with local entity
|
|
130
|
+
const merged = {
|
|
131
|
+
...local,
|
|
132
|
+
attributes: { ...local.attributes },
|
|
133
|
+
metadata: {
|
|
134
|
+
...local.metadata,
|
|
135
|
+
updatedAt: new Date(),
|
|
136
|
+
version: Math.max(local.metadata.version, remote.metadata.version) + 1,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
const mergedFields = [];
|
|
140
|
+
// Merge name (LWW)
|
|
141
|
+
if (local.name !== remote.name) {
|
|
142
|
+
if (remote.metadata.updatedAt > local.metadata.updatedAt) {
|
|
143
|
+
merged.name = remote.name;
|
|
144
|
+
mergedFields.push('name');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Merge namespace (LWW)
|
|
148
|
+
if (local.namespace !== remote.namespace) {
|
|
149
|
+
if (remote.metadata.updatedAt > local.metadata.updatedAt) {
|
|
150
|
+
merged.namespace = remote.namespace;
|
|
151
|
+
mergedFields.push('namespace');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Merge attributes (field-level LWW)
|
|
155
|
+
const allKeys = new Set([
|
|
156
|
+
...Object.keys(local.attributes),
|
|
157
|
+
...Object.keys(remote.attributes),
|
|
158
|
+
]);
|
|
159
|
+
for (const key of allKeys) {
|
|
160
|
+
const localVal = local.attributes[key];
|
|
161
|
+
const remoteVal = remote.attributes[key];
|
|
162
|
+
if (JSON.stringify(localVal) !== JSON.stringify(remoteVal)) {
|
|
163
|
+
// Use remote if it's newer
|
|
164
|
+
if (remote.metadata.updatedAt > local.metadata.updatedAt) {
|
|
165
|
+
merged.attributes[key] = remoteVal;
|
|
166
|
+
mergedFields.push(`attributes.${key}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Merge vector clocks
|
|
171
|
+
const mergedClock = new VectorClock(local.metadata.vectorClock);
|
|
172
|
+
mergedClock.merge(new VectorClock(remote.metadata.vectorClock));
|
|
173
|
+
merged.metadata.vectorClock = mergedClock.toValue();
|
|
174
|
+
return {
|
|
175
|
+
resolution: 'merged',
|
|
176
|
+
winner: merged,
|
|
177
|
+
mergedFields,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Resolve relationship conflict
|
|
182
|
+
*/
|
|
183
|
+
resolveRelationshipConflict(local, remote) {
|
|
184
|
+
// Relationships are simpler - use LWW
|
|
185
|
+
const winner = local.metadata.updatedAt > remote.metadata.updatedAt
|
|
186
|
+
? local
|
|
187
|
+
: remote;
|
|
188
|
+
return {
|
|
189
|
+
resolution: local.metadata.updatedAt > remote.metadata.updatedAt
|
|
190
|
+
? 'local-wins'
|
|
191
|
+
: 'remote-wins',
|
|
192
|
+
winner,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Batch resolve conflicts
|
|
197
|
+
*/
|
|
198
|
+
resolveAll(conflicts) {
|
|
199
|
+
return conflicts.map(({ local, remote, conflict }) => this.resolveEntityConflict(local, remote, conflict));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Get default strategy
|
|
203
|
+
*/
|
|
204
|
+
getDefaultStrategy() {
|
|
205
|
+
return this.defaultStrategy;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if custom resolver exists
|
|
209
|
+
*/
|
|
210
|
+
hasCustomResolver(entityType) {
|
|
211
|
+
return this.customResolvers.has(entityType);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=ConflictResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConflictResolver.js","sourceRoot":"","sources":["../../src/sync/ConflictResolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAoB/C;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACV,eAAe,CAAqB;IACpC,eAAe,GAAyC,IAAI,GAAG,EAAE,CAAC;IAEnF,YAAY,kBAAsC,kBAAkB;QAClE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAI,UAAkB,EAAE,QAA2B;QACjE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,QAAmC,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,oBAAoB,CAClB,KAAa,EACb,MAAc;QAEd,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEjE,IAAI,UAAU,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7C,OAAO;gBACL,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO;gBACpC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;gBACtC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS;gBACxC,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS;gBAC1C,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC;aAC7D,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,KAAa,EAAE,MAAc;QACzD,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,aAAa;QACb,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAED,kBAAkB;QAClB,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;YACzC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9B,CAAC;QAED,mBAAmB;QACnB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;YACtB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAChC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;SAClC,CAAC,CAAC;QAEH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3D,SAAS,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,qBAAqB,CACnB,KAAa,EACb,MAAc,EACd,QAAkB;QAElB,4BAA4B;QAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAW,CAAC;YACnE,OAAO;gBACL,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,QAAQ;gBAChB,YAAY,EAAE,QAAQ,CAAC,iBAAiB;aACzC,CAAC;QACJ,CAAC;QAED,uBAAuB;QACvB,QAAQ,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,KAAK,kBAAkB;gBACrB,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEtD,KAAK,mBAAmB;gBACtB,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEvD,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAErD;gBACE,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CACpB,KAAa,EACb,MAAc,EACd,QAAkB;QAElB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS;YACjE,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,MAAM,CAAC;QAEX,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS;gBAC9D,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,aAAa;YACjB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,eAAe,CACrB,KAAa,EACb,MAAc,EACd,QAAkB;QAElB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS;YACjE,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,MAAM,CAAC;QAEX,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS;gBAC9D,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,aAAa;YACjB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CACnB,KAAa,EACb,MAAc,EACd,QAAkB;QAElB,0BAA0B;QAC1B,MAAM,MAAM,GAAW;YACrB,GAAG,KAAK;YACR,UAAU,EAAE,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE;YACnC,QAAQ,EAAE;gBACR,GAAG,KAAK,CAAC,QAAQ;gBACjB,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;aACvE;SACF,CAAC;QAEF,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,mBAAmB;QACnB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxD,MAA2B,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gBAChD,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACxD,MAAiC,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBAChE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;YACtB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAChC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;SAClC,CAAC,CAAC;QAEH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3D,2BAA2B;gBAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBACzD,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;oBACnC,YAAY,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAChE,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;QAEpD,OAAO;YACL,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,MAAM;YACd,YAAY;SACb,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,2BAA2B,CACzB,KAAmB,EACnB,MAAoB;QAEpB,sCAAsC;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS;YACjE,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,MAAM,CAAC;QAEX,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS;gBAC9D,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,aAAa;YACjB,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CACR,SAAuE;QAEvE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CACnD,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,UAAkB;QAClC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;CACF"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/yata-scale - Sync Controller
|
|
3
|
+
*
|
|
4
|
+
* Coordinates synchronization between nodes
|
|
5
|
+
*/
|
|
6
|
+
import { type Result } from 'neverthrow';
|
|
7
|
+
import type { SyncSession, Entity, Relationship } from '../types.js';
|
|
8
|
+
import { SyncError, SyncConnectionError } from '../errors.js';
|
|
9
|
+
import { VectorClock } from './VectorClock.js';
|
|
10
|
+
import { ConflictResolver, type ResolutionStrategy } from './ConflictResolver.js';
|
|
11
|
+
import { WALManager } from './WALManager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Sync state
|
|
14
|
+
*/
|
|
15
|
+
export type SyncState = 'idle' | 'syncing' | 'conflict' | 'error';
|
|
16
|
+
/**
|
|
17
|
+
* Sync delta
|
|
18
|
+
*/
|
|
19
|
+
export interface SyncDelta {
|
|
20
|
+
readonly entities: Entity[];
|
|
21
|
+
readonly relationships: Relationship[];
|
|
22
|
+
readonly deletedEntityIds: string[];
|
|
23
|
+
readonly deletedRelationshipIds: string[];
|
|
24
|
+
readonly vectorClock: Record<string, number>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Peer connection
|
|
28
|
+
*/
|
|
29
|
+
export interface PeerConnection {
|
|
30
|
+
readonly peerId: string;
|
|
31
|
+
readonly endpoint: string;
|
|
32
|
+
readonly lastSyncTime?: Date;
|
|
33
|
+
readonly vectorClock: VectorClock;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Sync result
|
|
37
|
+
*/
|
|
38
|
+
export interface SyncResult {
|
|
39
|
+
readonly success: boolean;
|
|
40
|
+
readonly entitiesSynced: number;
|
|
41
|
+
readonly relationshipsSynced: number;
|
|
42
|
+
readonly conflictsResolved: number;
|
|
43
|
+
readonly errors: string[];
|
|
44
|
+
readonly duration: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Sync controller for managing distributed synchronization
|
|
48
|
+
*/
|
|
49
|
+
export declare class SyncController {
|
|
50
|
+
private readonly nodeId;
|
|
51
|
+
private readonly wal;
|
|
52
|
+
private readonly conflictResolver;
|
|
53
|
+
private readonly vectorClock;
|
|
54
|
+
private state;
|
|
55
|
+
private activeSessions;
|
|
56
|
+
private peers;
|
|
57
|
+
constructor(nodeId: string, resolutionStrategy?: ResolutionStrategy);
|
|
58
|
+
/**
|
|
59
|
+
* Register a peer
|
|
60
|
+
*/
|
|
61
|
+
registerPeer(peerId: string, endpoint: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Unregister a peer
|
|
64
|
+
*/
|
|
65
|
+
unregisterPeer(peerId: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Record entity create
|
|
68
|
+
*/
|
|
69
|
+
recordCreate(entity: Entity): void;
|
|
70
|
+
/**
|
|
71
|
+
* Record entity update
|
|
72
|
+
*/
|
|
73
|
+
recordUpdate(entity: Entity, previous?: Entity): void;
|
|
74
|
+
/**
|
|
75
|
+
* Record entity delete
|
|
76
|
+
*/
|
|
77
|
+
recordDelete(entityId: string, previous?: Entity): void;
|
|
78
|
+
/**
|
|
79
|
+
* Record relationship create
|
|
80
|
+
*/
|
|
81
|
+
recordRelationshipCreate(relationship: Relationship): void;
|
|
82
|
+
/**
|
|
83
|
+
* Record relationship update
|
|
84
|
+
*/
|
|
85
|
+
recordRelationshipUpdate(relationship: Relationship, previous?: Relationship): void;
|
|
86
|
+
/**
|
|
87
|
+
* Record relationship delete
|
|
88
|
+
*/
|
|
89
|
+
recordRelationshipDelete(relationshipId: string, previous?: Relationship): void;
|
|
90
|
+
/**
|
|
91
|
+
* Get local delta since a sequence number
|
|
92
|
+
*/
|
|
93
|
+
getLocalDelta(sinceSequence: number): SyncDelta;
|
|
94
|
+
/**
|
|
95
|
+
* Apply remote delta
|
|
96
|
+
*/
|
|
97
|
+
applyRemoteDelta(delta: SyncDelta, localEntities: Map<string, Entity>, localRelationships: Map<string, Relationship>): Result<SyncResult, SyncError>;
|
|
98
|
+
/**
|
|
99
|
+
* Start sync session with peer
|
|
100
|
+
*/
|
|
101
|
+
startSession(peerId: string): Result<SyncSession, SyncConnectionError>;
|
|
102
|
+
/**
|
|
103
|
+
* End sync session
|
|
104
|
+
*/
|
|
105
|
+
endSession(peerId: string): void;
|
|
106
|
+
/**
|
|
107
|
+
* Get current sync state
|
|
108
|
+
*/
|
|
109
|
+
getState(): SyncState;
|
|
110
|
+
/**
|
|
111
|
+
* Get vector clock
|
|
112
|
+
*/
|
|
113
|
+
getVectorClock(): VectorClock;
|
|
114
|
+
/**
|
|
115
|
+
* Get WAL manager
|
|
116
|
+
*/
|
|
117
|
+
getWAL(): WALManager;
|
|
118
|
+
/**
|
|
119
|
+
* Get conflict resolver
|
|
120
|
+
*/
|
|
121
|
+
getConflictResolver(): ConflictResolver;
|
|
122
|
+
/**
|
|
123
|
+
* Get active sessions
|
|
124
|
+
*/
|
|
125
|
+
getActiveSessions(): SyncSession[];
|
|
126
|
+
/**
|
|
127
|
+
* Get registered peers
|
|
128
|
+
*/
|
|
129
|
+
getPeers(): PeerConnection[];
|
|
130
|
+
/**
|
|
131
|
+
* Get node ID
|
|
132
|
+
*/
|
|
133
|
+
getNodeId(): string;
|
|
134
|
+
/**
|
|
135
|
+
* Get sync statistics
|
|
136
|
+
*/
|
|
137
|
+
getStats(): {
|
|
138
|
+
nodeId: string;
|
|
139
|
+
state: SyncState;
|
|
140
|
+
activeSessions: number;
|
|
141
|
+
registeredPeers: number;
|
|
142
|
+
walSequence: number;
|
|
143
|
+
vectorClock: Record<string, number>;
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Reset sync state
|
|
147
|
+
*/
|
|
148
|
+
reset(): void;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=SyncController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncController.d.ts","sourceRoot":"","sources":["../../src/sync/SyncController.ts"],"names":[],"mappings":"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"}
|